Может ли коллекция Set в Java содержать одинаковые (дублирующиеся) элементы?

«Может ли коллекция Set в Java содержать одинаковые (дублирующиеся) элементы?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не может. Основной контракт интерфейса 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