Побачив фрагмент коду, як
Set<Record> instances = new HashSet<Record>();
Мені цікаво, чи Hashset - це особливий вид набору. Будь-яка різниця між ними?
Побачив фрагмент коду, як
Set<Record> instances = new HashSet<Record>();
Мені цікаво, чи Hashset - це особливий вид набору. Будь-яка різниця між ними?
Відповіді:
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)
.
На запитання відповіли, але я не бачив відповіді на те, чому в коді згадуються обидва типи в одному коді.
Як правило, ви хочете кодувати інтерфейси, які в даному випадку мають значення Set. Чому? Тому що якщо ви завжди посилаєтесь на свій об’єкт через інтерфейси (крім нового HashSet ()), то тривіально змінити реалізацію об’єкта пізніше, якщо виявите, що було б краще це зробити, оскільки ви лише один раз згадали про це у своєму коді base (де ви створили новий HashSet ()).
Набір - це колекція, яка не містить повторюваних елементів. Набір - це інтерфейс.
HashSet реалізує Set
інтерфейс, підкріплений хеш-таблицею (насправді HashMap
екземпляром).
Оскільки HashSet
це одна із специфічних реалізацій Set
інтерфейсу.
A Set
може бути будь-яким із наступних, оскільки його реалізовували нижчекласні класи
ConcurrentSkipListSet : масштабована паралельна реалізація NavigableSet на основі ConcurrentSkipListMap
. Елементи набору сортуються відповідно до їх природного впорядкування або за Comparator
умови надання під час створення набору, залежно від того, який конструктор використовується.
CopyOnWriteArraySet : набір, який використовує внутрішній CopyOnWriteArrayList для всіх своїх операцій.
EnumSet : спеціалізована реалізація набору для використання з типами перечислення . Усі елементи в наборі перелічень повинні походити з одного типу переліку, який визначається явно або неявно під час створення набору.
TreeSet : реалізація NavigableSet на основі TreeMap. Елементи впорядковуються, використовуючи їх природне впорядкування, або компаратором, що надається під час встановленого часу створення, залежно від того, який конструктор використовується.
LinkedHashSet : реалізація таблиці золів та пов'язаного списку інтерфейсу Set із передбачуваним порядком ітерацій. Ця реалізація відрізняється від HashSet тим, що вона підтримує подвійно пов'язаний список, що проходить через усі його записи.
Але HashSet
може бути лише LinkedHashSet
з LinkedHashSet
підкласівHashSet
HashSet - це клас, похідний від інтерфейсу Set. Як похідний клас Set, HashSet досягає властивостей Set. Важливими та найбільш часто використовуваними похідними класами Set є HashSet та TreeSet.
**
** Це інтерфейс, який є підтипом інтерфейсу колекції, як і LIST та QUEUE.
Набір має нижче 3 підкласів, він використовується для зберігання кількох об’єктів без дублікатів.
**
**
Можна використовувати одне значення NULL (оскільки повторення заборонено), дані зберігаються випадковим чином, оскільки вони не підтримують послідовність.