Ответ
Нет, не может. Основной контракт интерфейса Set — хранить только уникальные элементы.
Как это обеспечивается:
- При добавлении элемента (
add(E e)) проверяется, не содержится ли уже равный ему элемент в множестве. - Проверка на равенство осуществляется с помощью методов
equals()иhashCode(). - Если элемент уже существует, метод
add()возвращаетfalse, и множество не изменяется.
Пример:
Set<String> fruitSet = new HashSet<>();
System.out.println(fruitSet.add("Apple")); // true
System.out.println(fruitSet.add("Apple")); // false! Элемент не добавлен
System.out.println(fruitSet.size()); // 1
Важное исключение для TreeSet:
TreeSet использует для сравнения не equals(), а метод compareTo() (или переданный Comparator). Если compareTo() возвращает 0, элементы считаются одинаковыми, даже если equals() возвращает false.
// Два разных объекта, но compareTo() возвращает 0
Set<BadComparable> treeSet = new TreeSet<>();
treeSet.add(new BadComparable(1));
treeSet.add(new BadComparable(1)); // Не добавится, хотя equals() мог бы вернуть false