Исключение повторяющихся значений в Set - PullRequest
1 голос
/ 24 июня 2011

Говорят, что те структуры, которые реализуют интерфейс Set, не допускают дублирования элементов.Я просто хочу знать, что они имеют в виду под дубликатом?Дублировать с точки зрения ценностей?Или с точки зрения объектов.например, я могу добавить два объекта Integer одинакового значения.Я также могу добавить один и тот же объект дважды.Что они имеют в виду под дубликатом?Когда будет выброшено исключение?

Ответы [ 6 ]

4 голосов
/ 24 июня 2011

Дубликат означает, как объяснено в другом посте a.equals(b), что подразумевает a.hashCode()==b.hashCode().Однако при добавлении дублирующего элемента исключений не будет, просто он не будет добавлен дважды.

2 голосов
/ 24 июня 2011

В java.util Коллекции, дубликат означает, что a.equals(b) и что должно означать, что a.hashcode()==b.hashcode()

2 голосов
/ 24 июня 2011

Определение равенства зависит от контейнера. Обычно это отношение .equals () /. HashCode (), но есть некоторые контейнеры, которые используют идентичность для равенства.

1 голос
/ 24 июня 2011

Согласно Javadocs;это означает, что любые два элемента, в которых e1.equals(e2) возвращает true, рассматриваются как дублирующие элементы.Различные реализации набора используют разные стратегии для хранения элементов;HashSet использует hashCode объектов, тогда как TreeSet использует естественное упорядочение (Comparable интерфейс) или пользовательский Comparator.

0 голосов
/ 24 июня 2011

Fiver и Alvin дали хорошие ответы, потому что «aps» говорит, что он может добавить два одинаковых целых числа и объекты, но не получить никаких ошибок компиляции или исключения времени выполнения, что является правдой.

Если вы добавите эти объекты, как вы говорите, а затем запустите некоторый код, такой как

System.out.println(theSetYouMade.size());

, и вы увидите, что он не добавил дубликаты, о которых вы говорили.

0 голосов
/ 24 июня 2011

obj1 является дубликатом obj2, если obj1.equals(obj2) возвращает true. Итак, как вы можете видеть, определение равенства действительно зависит от реализации равенства.

Вы можете написать набор, скажем, DistincObjectSet, где дубликат означает obj1==obj2

Другой пример: у вас может быть EmployeeSet, где duplicate означает obj1.employeeNo == obj2.employeeNo, в этом случае вы должны перезаписать метод equals () в классе Employee для сравнения чисел сотрудников.

Конструкция API-интерфейса Set говорит о том, что вы пытаетесь добавить дублирующий элемент, метод add () должен возвращать значение false, а не генерировать Exception.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...