В чем разница между HashSet и Set? - PullRequest
64 голосов
/ 28 февраля 2011

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

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

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

Ответы [ 8 ]

78 голосов
/ 28 февраля 2011

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

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

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

30 голосов
/ 28 февраля 2011

HashSet является реализацией Set.

14 голосов
/ 28 февраля 2011

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

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

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

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

4 голосов
/ 03 января 2018

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

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

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

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

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

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

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

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

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

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

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

Set является родительским интерфейсом всех классов набора, таких как TreeSet, LinkedHashSet и т. Д.

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

0 голосов
/ 12 марта 2019

**

  • Set:

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

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

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

**

  • HashSet:

**

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

0 голосов
/ 06 февраля 2019

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

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