Разлики между HashMap и Hashtable

1. Общ преглед

В този кратък урок ще се съсредоточим върху основните разлики между Hashtable и HashMap .

2. Hashtable и HashMap в Java

Hashtable и HashMap са доста сходни - и двете са колекции, които реализират интерфейса Map .

Също така методите put () , get () , remove () и containsKey () осигуряват постоянна производителност O (1). Вътрешно тези методи работят въз основа на обща концепция за хеширане с използване на сегменти за съхранение на данни.

Нито един клас не поддържа реда на вмъкване на елементите. С други думи, първият добавен елемент може да не е първият елемент, когато итерираме над стойностите.

Но те също имат някои разлики, които правят някои по-добри от други в някои ситуации. Нека разгледаме по-отблизо тези разлики.

3. Разлики между Hashtable и HashMap

3.1. Синхронизация

Първо, Hashtable е безопасен за нишки и може да се споделя между множество нишки в приложението.

От друга страна, HashMap не е синхронизиран и не може да бъде достъпен от множество нишки без допълнителен код за синхронизация. Можем да използваме Collections.synchronizedMap (), за да направим нишка-безопасна версия на HashMap . Също така можем просто да създадем персонализиран код за заключване или да направим кода безопасен за нишки, като използваме синхронизираната ключова дума.

HashMap не е синхронизиран, следователно е по-бърз и използва по-малко памет от Hashtable . Като цяло несинхронизираните обекти са по-бързи от синхронизираните в едно резбово приложение.

3.2. Нулеви стойности

Друга разлика е нулевата обработка. HashMap позволява добавяне на един запис с null като ключ, както и много записи с null като стойност. За разлика от тях Hashtable не позволява нула изобщо . Нека да видим пример за null и HashMap :

HashMap map = new HashMap(); map.put(null, "value"); map.put("key1", null); map.put("key2", null);

Това ще доведе до:

assertEquals(3, map.size());

След това нека видим как Hashtable е различен:

Hashtable table = new Hashtable(); table.put("key", null);

Това води до NullPointerException . Добавянето на обект с null като ключ също води до NullPointerException :

table.put(null, "value");

3.3. Итерация върху елементи

HashMap използва Iterator за итерация над стойности, докато Hashtable има Enumerator за същото. В итератор е наследник на Enumerator която елиминира малкото му недостатъци. Например Iterator има метод remove () за премахване на елементи от основните колекции.

В итератор е безпогрешна бързо итератор. С други думи, той изхвърля ConcurrentModificationException, когато основната колекция се модифицира по време на итерация. Нека да видим примера с бърз неуспех:

HashMap map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ iterator.next(); map.put("key4", "value4"); }

Това хвърля изключение ConcurrentModificationException, защото извикваме put (), докато итерираме над колекцията.

4. Кога да изберете HashMap Над Hashtable

Трябва да използваме HashMap за несинхронизирано или еднонишко приложение.

Струва си да се спомене, че от JDK 1.8 Hashtable е остарял. Въпреки това, ConcurrentHashMap е чудесен Hashtable замяна. Трябва да помислим ConcurrentHashMap да се използва в приложения с множество нишки.

5. Заключение

В тази статия илюстрирахме разликите между HashMap и Hashtable и какво да имаме предвид, когато трябва да изберем такъв.

Както обикновено, изпълнението на всички тези примери и кодови фрагменти приключи на Github.