Коллекция <E>и Набор <E>одинаковы? - PullRequest
4 голосов
/ 21 февраля 2011

У меня есть вопрос об этих двух интерфейсах в Java.Набор расширяет коллекцию, но ничего не добавляет.Они точно такие же.Я что-то здесь упускаю?

Ответы [ 6 ]

8 голосов
/ 21 февраля 2011

Set не допускает дублирование.

Это семантическая разница, а не синтаксическая.

6 голосов
/ 21 февраля 2011

Из документации Collection:

Коллекция представляет собой группу объектов, известных как ее элементы. Некоторые коллекции допускают дублирование элементов, а другие - нет. Некоторые заказаны, а другие неупорядочены.

Из документации Set:

Коллекция, которая не содержит повторяющихся элементов. Более формально, наборы не содержат пары элементов e1 и e2, таких как e1.equals(e2), и не более одного null элемента.Как следует из его названия, этот интерфейс моделирует абстракцию математического набора.

Это должно прояснить разницу между Set и (более общий интерфейс) Collection.

5 голосов
/ 21 февраля 2011

Хороший вопрос.Я предполагаю, что основная цель явного наличия интерфейса для концепции Set по сравнению с концепцией Collection состоит в том, чтобы фактически формально различать понятия.Допустим, вы пишете метод

void x(Collection<?> c);

У вас не будет того же представления о том, какие аргументы вы хотите получить, как если бы вы писали

void x(Set<?> s);

Второй методожидает Collections, которые содержат каждый элемент не более одного раза (то есть Sets).Это большая семантическая разница с первым методом, который не заботится о том, получает ли он Sets, Lists или любой другой тип Collection

Если вы внимательно посмотрите, Javadoc из Set метод также отличается, явно показывая различные понятия, которые вступают в игру, когда речь идет о Collection или Set

2 голосов
/ 21 февраля 2011

Коллекция - это более общий интерфейс, который включает списки, очереди, наборы и многое другое.

Ознакомьтесь с разделом ' Все известные подинтерфейсы ' здесь .

0 голосов
/ 21 февраля 2011

Кроме того, документация Set определяет контракт для .equals, в котором говорится, "только другие Наборы могут быть равны этому набору" . Если бы мы не могли распознать другие Наборы по их типу (с instanceof), это было бы невозможно реализовать.

Если бы это было только для equals(), было бы возможно иметь метод allowsDuplicates() для Collection. Но часто бывают случаи, когда API-интерфейсы хотят сказать «пожалуйста, не давайте мне дубликаты» или «я гарантирую, что они не содержат дубликатов», а в Java нет способа сказать в объявлении метода «пожалуйста, давайте только коллекции, allowsDuplicates() метод возвращает false ". Таким образом, дополнительный тип.

0 голосов
/ 21 февраля 2011

Все в документации:

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

и

Коллекция - корневой интерфейс в иерархии коллекции.Коллекция представляет собой группу объектов, известных как ее элементы.Некоторые коллекции допускают дублирование элементов, а другие - нет.Некоторые заказаны, а другие не заказаны.SDK не предоставляет каких-либо прямых реализаций этого интерфейса: он предоставляет реализации более специфических подинтерфейсов, таких как Set и List.Этот интерфейс обычно используется для передачи коллекций и манипулирования ими там, где требуется максимальная универсальность.

Это только для того, чтобы различать реализацию и будущее использование.

Это взято из теории множеств и словаря

Коллекция - что-то, что собрано;группа объектов или количество материала, накопленное в одном месте, особенно для какой-либо цели или в результате какого-либо процесса

Набор - это набор отдельных объектов

...