Яка різниця між HashSet та Set?


Відповіді:


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, який зберігає деякий порядок для ітератора), ConcurrentSkipListSet (реалізація з збереженим потоком SortedSet), CopyOnWriteArraySet (безпечний для потоку варіант, оптимізований для "багато читань, дуже рідко пише "), EnumSet (який працює лише для типів переліку для елементів, але тоді навіть швидший, ніж HashSet).
Paŭlo Ebermann

7
@Erik: Я прошу відредагувати вашу відповідь. TreeSet відсортовано не упорядковано. HashSet = Невпорядковано, TreeSet = відсортовано, LinkedHashSet = упорядковано. Будь ласка, змініть свою відповідь відповідно
Rais Alam

Хешсет може бути повільнішим, якщо імплементація hashCode є поганою (наприклад, завжди повертати той самий хеш-код)
Romain Hautefeuille

35

Це HashSetреалізація a Set.


14
Я не розумію цей коментар. Питання в тому, "в чому різниця", а не "в чому взаємозв’язок".
jambox

8
Він пояснив різницю: Set - це інтерфейс, HashSet - реалізація цього інтерфейсу. Тому вони не є різними реалізаціями, просто HashSet є однією з реалізацій Set (інша реалізація - TreeSet).
AggieDev


3
Залишив вас проти, тому що ви взагалі не відповіли на запитання. Надалі я рекомендую вам додати документацію, приклади та порівняння. Просто написання одного речення, а більша частина вмісту - це лише посилання на інші місця, це НЕ те, як ви відповідаєте на запитання в Stack Overflow.
Урда

На це питання було дано відповідь 6 років тому (див. Вище), але дякую.
vaugham 01.03.18

16

На запитання відповіли, але я не бачив відповіді на те, чому в коді згадуються обидва типи в одному коді.

Як правило, ви хочете кодувати інтерфейси, які в даному випадку мають значення Set. Чому? Тому що якщо ви завжди посилаєтесь на свій об’єкт через інтерфейси (крім нового HashSet ()), то тривіально змінити реалізацію об’єкта пізніше, якщо виявите, що було б краще це зробити, оскільки ви лише один раз згадали про це у своєму коді base (де ви створили новий HashSet ()).


14

Набір - це колекція, яка не містить повторюваних елементів. Набір - це інтерфейс.

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

Оскільки HashSetце одна із специфічних реалізацій Setінтерфейсу.

A Setможе бути будь-яким із наступних, оскільки його реалізовували нижчекласні класи

ConcurrentSkipListSet : масштабована паралельна реалізація NavigableSet на основі ConcurrentSkipListMap. Елементи набору сортуються відповідно до їх природного впорядкування або за Comparatorумови надання під час створення набору, залежно від того, який конструктор використовується.

CopyOnWriteArraySet : набір, який використовує внутрішній CopyOnWriteArrayList для всіх своїх операцій.

EnumSet : спеціалізована реалізація набору для використання з типами перечислення . Усі елементи в наборі перелічень повинні походити з одного типу переліку, який визначається явно або неявно під час створення набору.

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

LinkedHashSet : реалізація таблиці золів та пов'язаного списку інтерфейсу Set із передбачуваним порядком ітерацій. Ця реалізація відрізняється від HashSet тим, що вона підтримує подвійно пов'язаний список, що проходить через усі його записи.

Але HashSetможе бути лише LinkedHashSetз LinkedHashSetпідкласівHashSet


8

Set - це загальний інтерфейс до набору, подібного до набору, тоді як HashSet - це конкретна реалізація інтерфейсу Set (який використовує хеш-коди, звідси і назва).


2

Set є батьківським інтерфейсом усіх класів набору, таких як TreeSet, LinkedHashSet тощо.

HashSet - це клас, що реалізує інтерфейс Set.


0

HashSet - це клас, похідний від інтерфейсу Set. Як похідний клас Set, HashSet досягає властивостей Set. Важливими та найбільш часто використовуваними похідними класами Set є HashSet та TreeSet.


-1

**

  • Набір:

** Це інтерфейс, який є підтипом інтерфейсу колекції, як і LIST та QUEUE.

Набір має нижче 3 підкласів, він використовується для зберігання кількох об’єктів без дублікатів.

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

**

  • HashSet:

**

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.