Побачив фрагмент коду, як
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 (оскільки повторення заборонено), дані зберігаються випадковим чином, оскільки вони не підтримують послідовність.