Коли ви вивчаєте нову комп'ютерну мову, одне з перших, про що ви питаєте, - це як працювати з великими групами даних. Ця тема часто висвітлюється в темі «Структури даних». Якщо ви копаєтеся глибше, ви повинні обійти теми, такі як пов’язані списки, черги, стеки та двійкові дерева серед багатьох інших структур даних. У Java ці структури є частиною Java Collections Framework. Колекція - це не що інше, як тип структури даних, що відноситься до угруповання декількох елементів даних, а Java Collections Framework стандартизує спосіб обробки цих груп об'єктів. Насправді рамки колекцій були розроблені для задоволення кількох цілей.
Вся рамка колекцій розроблена навколо набору стандартних інтерфейсів. Ці декілька стандартних реалізацій, такі як LinkedList, HashSet і TreeSet, забезпечують ці інтерфейси, які ви, можливо, є. Крім того, ви також можете реалізувати власну колекцію, якщо захочете. Однак, окрім колекцій, рамка визначає кілька інтерфейсів карт та класів. Java містить три реалізації карти загального призначення - HashMap, TreeMap та LinkedHashMap - які зберігають пари ключ / значення. Хоча карти технічно не є колекціями, вони повністю інтегровані з колекціями. Насправді карти фокусуються на групах асоціацій між об'єктами. У цій статті узагальнено ключові відмінності між HashMap та HashSet.
HashMap - це найпоширеніша реалізація інтерфейсу Map, який забезпечує основну карту ключа / значення, де елементи не упорядковані. Він використовує спеціальне значення, яке називається хеш-кодом, замість повільного пошуку ключа. Хеш-код - це спосіб взяти інформацію у відповідний об'єкт і перетворити його у "відносно унікальний" для цього об'єкта. Він просто працює на принципі хешування, а це означає, що він використовує хеш-функцію для відображення ідентифікаційних значень. Як і Vector та Stack мають свої заміни в ArrayList та LinkedList, Hashtable має заміну в HashMap. Він розширює AbstractMap для реалізації інтерфейсу Map, використовуючи внутрішнє представлення Hashtable. І подібно до інших реалізацій загального призначення, HashMap підтримує необов'язкові методи Map, дозволяє отримати нульові значення та не синхронізуватися.
HashSet - один із членів Java Collections Framework, який реалізує інтерфейс Set, підкріплений хеш-таблицею, яка насправді є екземпляром HashMap. Як випливає з назви, вона реалізована хеш-таблицею, масивом, в якому елементи зберігаються у позиції, отриманій із їх вмісту. На відміну від Map, Set - це саме колекція з точно таким же інтерфейсом, тому немає жодної додаткової функціональності, як у двох різних списків. HashSet використовує функцію хешування, розроблену спеціально для швидкого пошуку. Це невпорядкована колекція унікальних об'єктів, яка не може зберігати повторювані значення. HashSet розширює клас AbstractSet, який реалізує інтерфейс Set. Однак HashSet не визначає ніяких додаткових методів, окрім тих, що надаються його суперкласами та інтерфейсами.
HashMap - це найпоширеніша реалізація інтерфейсу Map, який забезпечує основну карту ключа / значення, де елементи не упорядковані. Він просто працює на принципі хешування, а це означає, що він використовує хеш-функцію для відображення ідентифікаційних значень. HashSet, з іншого боку, є одним з членів Java Collections Framework, який реалізує інтерфейс Set, підкріплений хеш-таблицею, яка насправді є екземпляром HashMap. Простіше кажучи, HashMap реалізує інтерфейс Map, тоді як HashSet реалізує інтерфейс Set.
HashSet створює колекцію, яка використовує хеш-таблицю для зберігання. Таблиця хешу зберігає інформацію за допомогою методу, який називається хешування. Для зберігання елементів або значень HashSet використовує функцію хешування, спеціально розроблену для швидкого пошуку. Більшість функцій HashSet забезпечується через суперклас AbstractCollection та AbstractSet, який HashSet ділиться з TreeSet. HashMap розширює AbstractMap для реалізації інтерфейсу Map, використовуючи внутрішнє представлення Hashtable. Обидва класи не синхронізовані, тобто вони не підходять для безпечних потокових операцій.
Оскільки Map не підтримує повторювані ключі, HashMap не дозволяє повторювати ключі, але дозволяється мати повторювані значення. Це означає, що у HashMap можуть існувати повторювані значення, але ви можете використовувати collection як значення проти якогось ключа. Кожен ключ повинен бути унікальним у HashMap, і для одного ключа не може бути дозволено мати більше 1 значення. HashSet, з іншого боку, не може мати дублікати елементів за допомогою простого визначення набору, що означає, що ви не можете зберігати дублікати значень у HashSet. HashMap дозволяє лише один нульовий ключ, але дозволяє будь-яку кількість нульових значень, тоді як HashSet дозволяє лише одне нульове значення.
HashMap працює за принципом хешування, це означає, що він використовує хеш-функцію для відображення внутрішніх ідентифікаційних значень за допомогою алгоритму хешування для легкого пошуку. Справжній механізм хешування завжди повертає той самий хеш-код () при застосуванні до одного і того ж об'єкта. З іншого боку, HashSet внутрішньо використовує HashMap як резервну структуру даних для додавання або зберігання об'єктів. Це означає, що коли буде створений об’єкт HashSet, він створить об’єкт HashMap.
Хоча і HashMap, і HashSet не синхронізовані, це означає, що вони не підходять для безпечних потоків операцій, і вони є абсолютно різними конструкціями, вони забезпечують постійну продуктивність у часі для основних операцій, таких як додавання, видалення елемента тощо. Хоча HashMap є загальною реалізацією Інтерфейс Map, який зберігає пари ключів / значень, HashSet - це реалізація інтерфейсу Set. HashSet використовує HashMap для підтримки його реалізації. Однак HashMap використовує хеш-принцип і використовує його для швидкого пошуку ключа.