Крім того, що HashSet
не дозволяє повторювати значення, у чому різниця між HashMap
і HashSet
?
Я маю на увазі мудре виконання? Це трохи розпливчасто, оскільки обидва використовують хеш-таблиці для зберігання значень.
Крім того, що HashSet
не дозволяє повторювати значення, у чому різниця між HashMap
і HashSet
?
Я маю на увазі мудре виконання? Це трохи розпливчасто, оскільки обидва використовують хеш-таблиці для зберігання значень.
Відповіді:
Вони абсолютно різні конструкції. A HashMap
- це реалізація Map
. Карта відображає ключі на значення. Ключовий пошук відбувається за допомогою хеша.
З іншого боку, a HashSet
- це реалізація Set
. Набір призначений для відповідності математичної моделі набору. A HashSet
використовує a, HashMap
щоб підтримати його реалізацію, як ви зазначили. Однак він реалізує зовсім інший інтерфейс.
Коли ви шукаєте, що буде найкраще Collection
для ваших цілей, цей Підручник є хорошим початковим місцем. Якщо ви справді хочете знати, що відбувається, для цього теж є книга .
HashSet - це набір , наприклад {1,2,3,4,5}
HashMap - це ключове значення -> значення (ключ до значення), наприклад {a -> 1, b -> 2, c -> 2, d -> 1}
Зауважте в моєму прикладі вище, що в HashMap не повинно бути дублікатів ключів, але вони можуть мати повторювані значення.
У HashSet не повинно бути жодних повторюваних елементів.
HashSet не синхронізований, що означає, що вони не підходять для безпечних потокових операцій, поки тільки вони не будуть синхронізовані явно. [Подібність]
add contains next notes
HashSet O(1) O(1) O(h/n) h is the table
HashMap не синхронізований, що означає, що вони не підходять для безпечних потокових операцій до тих пір, поки не будуть синхронізовані явно. [Подібність]
get containsKey next Notes
HashMap O(1) O(1) O(h/n) h is the table
Будь ласка, зверніться до цієї статті, щоб знайти більше інформації.
Це справді прикро, що обидва їх імені починаються з Hash . Це найменш важлива їх частина. Важливі частини приходять після хешу - набір і карта , як вказували інші. Відповідно, вони є набором - не упорядкованою колекцією - і картою - колекцією з ключами доступу. Вони, як правило, реалізуються з хешами - саме звідси беруться імена - але їхня суть прихована за цією частиною їхніх імен.
Не плутайте їхні імена; вони глибоко різні речі.
У Hashset
Внутрішньо знаряддя HashMap
. Якщо ви бачите внутрішню реалізацію, значення, вставлені в HashSet, зберігаються як ключі в HashMap, а значення є об'єктом Dummy класу Object.
Різниця між HashMap і HashSet становить:
HashMap
містить пари ключових значень, і до кожного значення можна отримати доступ за ключем, оскільки, як HashSet потрібно повторювати кожен раз, оскільки немає методу отримання.HashMap
реалізує інтерфейс Map і дозволяє одне нульове значення як ключ, а кілька нульових значень як значень. Де HashSet
реалізується Інтерфейс встановлення, дозволяє лише одне нульове значення і не дублюється значення. (Зберегти один нульовий ключ дозволений у ключі HashMap, отже, одне нулеве значення в HashSet як HashSet реалізує HashMap внутрішньо). HashSet
і HashMap
не підтримує порядок вставки під час ітерації.Як випливають з імен, HashMap - це асоціативна карта (відображення від ключа до значення), а HashSet - це лише набір .
Відмінності між HashSet і HashMap на Java
1) Перша і найсуттєвіша відмінність HashMap від HashSet полягає в тому, що HashMap - це реалізація інтерфейсу Map, тоді як HashSet - це реалізація інтерфейсу Set, що означає, що HashMap є ключовою структурою даних на основі значень, і HashSet гарантує унікальність, не дозволяючи копії. реальність HashSet - це обгортка навколо HashMap на Java, якщо ви подивитесь на код методу add (E e) HashSet.java, ви побачите наступний код:
public boolean add(E e)
{
return map.put(e, PRESENT)==null;
}
де його занесення Об'єкта на карту як ключ і значення є кінцевим об'єктом НАСТУПНО, який є манекеном.
2) Друга відмінність HashMap від HashSet полягає в тому, що ми використовуємо метод add () для введення елементів у Set, але ми використовуємо метод put () для вставки ключа і значення в HashMap на Java.
3) HashSet дозволяє лише один нульовий ключ, але HashMap може дозволити один нульовий ключ + кілька нульових значень.
Це все на різниці між HashSet і HashMap на Java. Підсумовуючи, HashSet і HashMap - це два різних типи колекцій: один - Set, а інший - Map.
Відмінності між HashSet і HashMap на Java
HashSet внутрішньо використовує HashMap для зберігання предметів. Коли метод додавання (String) називається методом виклику HahsMap put (ключ, значення), де key = String object & value = new Object (Dummy), тому він не підтримує дублікатів, оскільки ключі є не що інше, як значення Об'єкт.
Об'єкти, які зберігаються як ключові в Hashset / HashMap, повинні перекрити контракт хеш-кодів і рівних.
Ключі, які використовуються для доступу / зберігання об'єктів значення в HashMap, повинні бути оголошені як Кінцеві, оскільки при зміні об'єкт Value не може бути розташований і повертає null.
A HashMap
- це додавання, отримання, видалення ... об'єктів, індексованих користувацьким ключем будь-якого типу.
A HashSet
- додавати елементи, видаляти елементи та перевіряти наявність елементів, порівнюючи їх хеші.
Таким чином, HashMap містить елементи, а HashSet запам'ятовує їхні хеші.
equals()
методи.
Відмінності: стосовно герархії: HashSet реалізує Set. HashMap реалізує Map і зберігає відображення ключів і значень.
Використання HashSet і HashMap стосовно бази даних допоможе вам зрозуміти значення кожного.
HashSet: зазвичай використовується для зберігання унікальних об'єктів колекції. Напр.: Він може бути використаний як клас реалізації для зберігання суднозв'язку "багато в один" між
класом "Елемент" і "Клас Bid", де (у "У
об'єкта є багато ставок") HashMap: використовується для відображення ключа до value.the може бути нульовим або будь-яким об'єктом / список об'єкта (який сам по собі є об'єктом).
HashSet використовує HashMap внутрішньо для зберігання своїх записів. Кожен запис у внутрішньому HashMap вводиться одним об'єктом, тому всі записи хешуються в одне відро. Я не пам'ятаю, що внутрішній HashMap використовує для зберігання своїх значень, але це насправді не має значення, оскільки цей внутрішній контейнер ніколи не буде містити повторюваних значень.
РЕДАКЦІЯ : Щоб вирішити коментар Метью, він правий; Я мав це назад. Внутрішній HashMap за допомогою клавіш Об'єкти, що складають елементи Set . Значення HashMap - це об'єкт, який просто зберігається у відрах HashMap.
HashMap
це Map
реалізація, що дозволяє повторювати значення, але не дублювати ключі. . Для додавання об'єкта потрібна пара ключ / значення. Допустимі значення Null Keys та Null. наприклад:
{The-> 3, world-> 5, is-> 2, nice-> 4}
HashSet
це Set
реалізація, яка не дозволяє дублікати. Якщо ви намагалися додати дублікат об'єкта, виклик public boolean add(Object o)
методу, то набір залишається незмінним і повертається false
. наприклад:
[Світ, є, приємно]
Ви майже відповіли на власне запитання - хешсет не дозволяє повторювати значення. було б банально побудувати хеш-код за допомогою резервного хешмапу (і просто перевірити, чи є значення вже). Я здогадуюсь, що різні реалізації Java або роблять це, або реалізують якийсь спеціальний код, щоб зробити це більш ефективно.
java.util.HashSet
говорить, що це підкріплено a java.util.HashMap
.
В основному в HashMap користувач повинен надавати і ключ, і значення, тоді як у HashSet ви надаєте лише значення, ключ автоматично отримується зі значення за допомогою хеш-функції. Отже, маючи і ключ, і значення, HashSet може зберігатися як HashMap внутрішньо.
HashSet і HashMap обидва зберігають пари, різниця полягає в тому, що в HashMap ви можете вказати ключ, а в HashSet ключ походить від хеш-коду об'єкта
HashMaps
дозволити один нульовий ключ та нульові значення. Вони не синхронізовані, що підвищує ефективність. Якщо це потрібно, ви можете зробити їх синхронізованими за допомогоюCollections.SynchronizedMap()
Hashtables
не дозволяють нульові ключі та синхронізуються.
HashMap - це реалізація інтерфейсу Map. HashSet - це реалізація інтерфейсу Set
HashMap Зберігає дані у вигляді пари ключових значень HashSet Store лише об'єкти
Для додавання елемента на карті використовується метод Put, який використовується для додавання елемента Set
У хеш-карті значення хеш-коду обчислюється за допомогою ключового об'єкта. Тут об'єкт-член використовується для обчислення значення хеш-коду, яке може бути однаковим для двох об'єктів, тому метод рівного () використовується для перевірки рівності, якщо він повертає помилковим, що означає, що два об'єкти різні.
HashMap швидше, ніж хешсет, тому що унікальний ключ використовується для доступу до об'єкта HashSet повільніше, ніж Hashmap