В чем разница между HashSet и Set?

83

Видел фрагмент кода вроде

Set<Record> instances = new HashSet<Record>();

Мне интересно, не является ли Hashset особенным набором. Есть ли между ними разница?

user496949
источник
8
Возможно, вы захотите познакомиться с концепцией интерфейсов
Никита Рыбак

Ответы:

101

A Setпредставляет собой общий «набор значений». A TreeSet- это набор, в котором элементы отсортированы (и, следовательно, упорядочены), a HashSet- это набор, в котором элементы не отсортированы и не упорядочены.

A HashSetобычно намного быстрее, чем a TreeSet.

A TreeSetобычно реализуется как красно-черное дерево (см. Http://en.wikipedia.org/wiki/Red-black_tree - я не проверял фактическую реализацию sun / oracle TreeSet), тогда как a HashSetиспользует Object.hashCode()для создания индекса в массив. Время доступа для красно-черного дерева равно O(log(n))времени доступа для HashSetдиапазона от постоянного времени до наихудшего (каждый элемент имеет один и тот же хэш-код), где вы можете иметь линейное время поиска O(n).

Эрик
источник
Кроме того, существуют эти универсальные реализации: LinkedHashSet (вариант HashSet, который сохраняет некоторый порядок для Iterator), ConcurrentSkipListSet (реализация SortedSet с сохранением потоков), CopyOnWriteArraySet (поточно-безопасный вариант, оптимизированный для "большого количества чтений, очень редко пишет "), EnumSet (который работает только с перечисляемыми типами для элементов, но тогда даже быстрее, чем HashSet).
Паоло Эберманн
7
@Erik: Прошу отредактировать ваш ответ. TreeSet сортируется не упорядоченно. HashSet = неупорядоченный, TreeSet = отсортированный, LinkedHashSet = упорядоченный. Пожалуйста, измените свой ответ соответствующим образом
Раис Алам
Hashset может быть медленнее, если реализация hashCode плохая (например, всегда возвращать один и тот же хэш-код)
Romain Hautefeuille
35

Это HashSetреализация Set.

Vaugham
источник
14
Я не понимаю этого комментария. Вопрос в том, «в чем разница», а не в том, «какие отношения между ними».
jambox 02
8
Он объяснил разницу: Set - это интерфейс, HashSet - это реализация этого интерфейса. Следовательно, это не разные реализации, просто HashSet является одной из реализаций Set (другой реализацией является TreeSet).
AggieDev
звучит как верный ответ для меня
Ромен Отфёй
3
Оставил вам голос против, потому что вы вообще не ответили на вопрос. В будущем я рекомендую вам добавить некоторую документацию, примеры и сравнения. Просто напишите одно предложение, и большая часть контента - это просто ссылки на другие места - это НЕ то, как вы отвечаете на вопросы о переполнении стека.
Urda
На этот вопрос был дан ответ 6 лет назад (см. Выше), но спасибо.
vaugham 01
16

На вопрос был дан ответ, но я не видел ответа, почему в коде упоминаются оба типа в одном коде.

Как правило, вы хотите кодировать интерфейсы, которые в данном случае установлены. Почему? Потому что, если вы всегда ссылаетесь на свой объект через интерфейсы (кроме new HashSet ()), тогда тривиально изменить реализацию объекта позже, если вы обнаружите, что было бы лучше сделать это, потому что вы упомянули об этом только один раз в своем коде. base (где вы сделали new HashSet ()).

ЯБольшойЖирныйГай
источник
14

Set - это коллекция, не содержащая повторяющихся элементов. Set - это интерфейс.

HashSet реализует Setинтерфейс, поддерживаемый хеш-таблицей (фактическиHashMap экземпляром).

Поскольку HashSetэто одна из конкретных реализацийSet интерфейса.

A Setможет быть любым из следующих, поскольку он был реализован следующими классами

ConcurrentSkipListSet : масштабируемая параллельная реализация NavigableSet на основе ConcurrentSkipListMap. Элементы набора хранятся отсортированными в соответствии с их естественным порядком или по Comparatorвремени создания набора, в зависимости от того, какой конструктор используется.

CopyOnWriteArraySet : набор, который использует внутренний CopyOnWriteArrayList для всех своих операций.

EnumSet : специализированная реализация Set для использования с перечисляемыми типами. Все элементы в наборе перечисления должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора.

TreeSet : реализация NavigableSet на основе TreeMap. Элементы упорядочиваются с использованием их естественного порядка или с помощью компаратора, предоставляемого во время создания набора, в зависимости от того, какой конструктор используется.

LinkedHashSet : реализация таблицы пепла и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи.

Но HashSetможет быть только LinkedHashSetпотому, что LinkedHashSetподклассыHashSet

Равиндра бабу
источник
8

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

GMW
источник
2

Set - это родительский интерфейс для всех установленных классов, таких как TreeSet, LinkedHashSet и т. Д.

HashSet - это класс, реализующий интерфейс Set.

unk1102
источник
0

HashSet - это класс, производный от интерфейса Set. Как производный класс Set, HashSet приобретает свойства Set. Важными и наиболее часто используемыми производными классами Set являются HashSet и TreeSet.

Hemlata Gehlot
источник
-1

**

  • Набор:

** Это интерфейс, который является подтипом интерфейса Collection, как LIST и QUEUE.

Set имеет менее 3 подклассов, он используется для хранения нескольких объектов без дубликатов.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (который реализует интерфейс SortedSet)

**

  • HashSet:

**

Может использовать одно значение NULL (поскольку дублирование не допускается), данные хранятся случайным образом, поскольку они не поддерживают последовательность.

Анонимный пользователь
источник