Подтвердить что ты не робот

Когда использовать Set vs. Collection?

Существует ли какая-либо практическая разница между Set и Collection в Java, кроме того, что a Collection может включать один и тот же элемент дважды? Они имеют одинаковые методы.

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

В качестве состояний @mmyers Collection включает Set, а также List.

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

Ответ 5

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

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

Ответ 6

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

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

Сбор гораздо более общий. Я считаю, что то, что майриеры писали об их использовании, говорит все.

Ответ 7

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

Ответ 8

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