когда использовать Set vs. Collection? - PullRequest
41 голосов
/ 04 мая 2009

Есть ли практическая разница между Set и Collection в Java, кроме того факта, что Collection может включать один и тот же элемент дважды? У них одинаковые методы.

(Например, Set дает мне больше возможностей использовать библиотеки, которые принимают Set с, но не Collection с?)

edit: Я могу придумать как минимум 5 разных ситуаций, чтобы судить об этом вопросе. Кто-нибудь еще может придумать больше? Я хочу убедиться, что я понимаю тонкости здесь.

  1. разработка метода, который принимает аргумент Set или Collection. Collection является более общим и допускает больше возможностей ввода. (если я разрабатываю определенный класс или интерфейс, я лучше отношусь к своим потребителям и более жестко отношусь к своим подклассистам / реализациям, если использую Collection.)
  2. разработка метода, который возвращает Set или Collection. Set предлагает больше гарантий, чем Collection (даже если это просто гарантия не включать один элемент дважды). (если я разрабатываю определенный класс или интерфейс, я лучше отношусь к своим потребителям и ужесточаю свои субклассеры / средства реализации, если использую Set.)
  3. разработка класса, который реализует интерфейс Set или Collection. Подобные проблемы, как # 2. Пользователи моего класса / интерфейса получают больше гарантий, субклассеры / разработчики несут большую ответственность.
  4. проектирование интерфейса, расширяющего интерфейс Set или Collection. Очень похоже на № 3.
  5. написание кода, который использует Set или Collection. Здесь я мог бы также использовать Set; единственные причины, по которым я могу использовать Collection, - это если я получаю Collection из чужого кода или если мне нужно обработать коллекцию, содержащую дубликаты.

Ответы [ 8 ]

43 голосов
/ 04 мая 2009

Collection также является супертипом List, Queue, Deque и других, что дает вам больше возможностей. Например, я пытаюсь использовать Collection в качестве параметра для библиотечных методов, которые не должны явно зависеть от определенного типа коллекции.

Как правило, вы должны использовать правильный инструмент для работы. Если вам не нужны дубликаты, используйте Set (или SortedSet, если вы хотите упорядочить, или LinkedHashSet, если вы хотите сохранить порядок вставки). Если вы хотите разрешить дублирование, используйте List и т. Д.

8 голосов
/ 04 мая 2009

Я думаю, что вы уже поняли - используйте Set, если вы хотите специально исключить дубликаты. Collection обычно является наименьшим общим знаменателем, и полезно указывать API-интерфейсы, которые принимают / возвращают это, что оставляет вам возможность изменить детали позже, если это необходимо. Однако, если данные вашего приложения требуют уникальных записей , используйте Set для обеспечения этого.

Также стоит подумать, важен ли для вас порядок; если это так, используйте List или LinkedHashSet, если вас интересует уникальность порядка и .

3 голосов
/ 04 мая 2009

Еще одна вещь, которую следует учитывать ... У наборов есть дополнительные издержки во времени, памяти и кодировании, чтобы гарантировать отсутствие дубликатов. (Время и память, потому что наборы обычно поддерживаются HashMap или Tree, который добавляет накладные расходы на список или массив. Кодирование, потому что вы должны реализовать методы hashCode () и equals ().)

Обычно я использую наборы, когда мне нужна быстрая реализация функции contains (), и использую Collection или List в противном случае, даже если в коллекции не должно быть дубликатов.

3 голосов
/ 04 мая 2009

Как утверждает @mmyers, коллекция включает в себя как Set, так и List.

Когда вы объявляете что-то как набор, а не как коллекцию, вы говорите, что переменная не может быть списком или картой. Впрочем, это всегда будет коллекция. Таким образом, любая функция, которая принимает коллекцию, примет набор, но функция, которая принимает набор, не может взять коллекцию (если вы не преобразуете ее в набор).

3 голосов
/ 04 мая 2009

См. Учебник по Java Collection для хорошего ознакомления с использованием Collection. В частности, ознакомьтесь с иерархией классов.

1 голос
/ 04 мая 2009

Практическое отличие состоит в том, что Set использует логику set , т.е. не дублирует и не упорядочивает, а Collection - нет. Поэтому, если вам нужна коллекция, и у вас нет особых требований избегать дублирования, используйте коллекцию. Если у вас есть требования для Set, используйте Set. Обычно используйте максимально возможный интерфейс.

1 голос
/ 04 мая 2009

Вы должны использовать Набор, когда это то, что вы хотите.

Например, список без заказа или дубликатов. Такие методы, как содержат, весьма полезны.

Коллекция гораздо более общая. Я полагаю, что то, что написал mmyers об их использовании, говорит обо всем.

0 голосов
/ 04 мая 2009

Поскольку Collection - это супер тип Set и SortedSet, они могут быть переданы методу, который ожидает Collection. Коллекция просто означает, что она может или не может быть отсортирована, заказать или разрешить дубликаты.

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