В чем разница между интерфейсами Collection и Set в Java?
Заявленные сигнатуры методов кажутся равными. Так, какова цель введения интерфейса Set вместо непосредственной реализации Collection? Или это просто интерфейс маркера?
1 ответ
Set
гарантирует, что коллекция будет содержать уникальные элементы (без дубликатов). Collection
не гарантирует это.
Интерфейс Set содержит только методы, унаследованные от Collection, и добавляет ограничение, запрещающее дублирование элементов.
В Set также добавлен более строгий контракт на поведение операций equals и hashCode, что позволяет осмысленно сравнивать экземпляры Set, даже если их типы реализации различаются. Два экземпляра Set равны, если они содержат одинаковые элементы.
Заметка, Set
не сохраняет порядок, в котором были вставлены элементы. Вы LinkedHashSet
если вам нужно сохранить порядок вставки элементов. /questions/38148712/kogda-ispolzovat-set-vs-collection/38148737#38148737
Думаю, я как бы понял то, что вы хотите знать.:)
Исходный код, поставляемый с JDK (src.zip), имеет 2 интерфейса, Collection
а также Set
и все методы, объявленные в Collection
интерфейс повторно объявлен в Set
интерфейс. На первый взгляд повторное объявление методов кажется излишним. Но если вы присмотритесь, то увидите, что подпись метода остается такой же, как иCollection
интерфейс, но комментарии изменены, чтобы описать, каким будет поведение методов при реализации классов.
Зачем Set
интерфейс существует, если интерфейса коллекции достаточно в случае Set (поскольку мы не вводим никаких новых методов в Set
интерфейс) (к сведению: здесь я игнорирую один метод, представленный в Set
интерфейс - <T> T[] toArray(T[] a);
).
Ans: Допустим, у вас есть два класса ClassA и ClassB реализации интерфейса Collection, и оба из них хранящих уникальные элементы (как Set). Теперь у вас есть метод, позволяющий сказатьpopulateSet(Collection setImpl);
и у вас есть код, предназначенный для работы с вашими ClassA и ClassB, и цель этого метода - вы можете использовать этот метод для взаимозаменяемой передачи ClassA и ClassB, пока все в порядке. Но теперь проблема с этим методом заключается в том, что вы можете передать ArrayList этому методу, поскольку интерфейс Collection является общим, и ваши методы начнут ломаться. Вот почему нам понадобился еще один интерфейс для категоризации всей реализации набора под одним капотом.