Разница между HashMap и Hashtable в Java?
Содержание
Оба HashTable и HashMap реализуют интерфейс карты, но между ними существуют некоторые различия. Они есть:
- Безопасность потоков (синхронизировано)
- Нулевые ключи
- Наследование
- Производительность
- Траверс
- Сбой
- Сложность по времени
- Наследие
Безопасность потоков (синхронизировано)
Первым и самым значительным различием между Hashtable и HashMap является то, что HashMap не является потокобезопасным (несинхронизированным), тогда как Hashtable представляет собой потокобезопасную (синхронизированную) коллекцию. Это делает HashMap лучше для не-потоковых приложений, поскольку несинхронизированные объекты обычно работают лучше, чем синхронизированные.
Первым и самым значительным различием между Hashtable и HashMap является то, что HashMap не является потокобезопасным (несинхронизированным), тогда как Hashtable представляет собой потокобезопасную (синхронизированную) коллекцию. Это делает HashMap лучше для не-потоковых приложений, поскольку несинхронизированные объекты обычно работают лучше, чем синхронизированные....
Вы можете сделать HashMap потокобезопасным (синхронизированным), вызвав этот код
Map mp = Collections.synchronizedMap(hashMap);
Null Keys
HashTable может содержать только ненулевой объект в качестве ключа или в качестве значения. Чтобы хранить и извлекать объекты из хеш-таблицы, объекты, используемые в качестве ключей, должны реализовывать метод hashCode и метод equals. Поскольку «null» не является объектом, вы не можете вызывать на нем .equals() или .hashCode(), поэтому Hashtable не может вычислить хэш, чтобы использовать его в качестве ключа.
Наследование
Хотя оба интерфейса HashMap и HashTable реализуют интерфейс Map, но они расширяют два разных класса. HashMap расширяет класс AbstractMap, где, поскольку HashTable расширяет класс Dictionary, который является унаследованным классом в JDK.
Производительность
HashMap не синхронизирован, поэтому он работает быстро. HashTable внутренне синхронизирован, что делает HashTable немного медленнее, чем HashMap. Несинхронизированные объекты часто намного лучше в производительности по сравнению с синхронизированным объектом, например Hashtable, в однопоточной среде.
Traverse
HashMap проходит через Iterator, а Hashtable проходит через Enumerator и Iterator.
Безотказная
Итератор в HashMap является отказоустойчивым, а перечислитель для Hashtable - нет. Отказоустойчивость относится к контексту итераторов. Если итератор был создан в объекте коллекции, а какой-либо другой поток пытается изменить объект коллекции «структурно», будет выбрано исключение параллельной модификации.
Сложность времени
Hashtable использует целую цепочку (со связанными списками) в качестве стратегии обработки столкновений, ограничивающей время поиска O (n). Начиная с JAVA 8 HashMap использует Balanced Tree в качестве стратегии разрешения конфликтов, которая имеет ограниченное временное время O (log n).
Наследство
HashMap является членом Java Collection Framework с самого начала его внедрения в JDK 1.2. Но HashTable был там до JDK 1.2, и он расширяет класс Dictionary, который является унаследованным классом в JDK. Из JDK 1.2 было сделано для реализации интерфейса Map, что делает его членом коллекции.
Внедрение HashMap
import Java.util.*; class TestClass { public static void main (String[] args) { // Создание HashMap HashMap < Integer,String > days = new HashMap < Integer,String >(); // Добавление пар ключ / значение days.put(1,"Sunday"); days.put(2,"Monday"); days.put(3,"Tuesday"); days.put(4,"Wednesday"); Set < Map.Entry < Integer,String > > set = days.entrySet(); for (Map.Entry < Integer,String > sg : set) { System.out.println("Key :"+sg.getKey() + " Value :"+days.get(sg.getKey())); } } }
Выход
Key :1 Value :Sunday Key :2 Value :Monday Key :3 Value :Tuesday Key :4 Value :Wednesday
Как создать документ Excel программно
Реализация Hashtable
import Java.util.*; class TestClass { public static void main (String[] args) { // Как создать Hashtable? Hashtable < Integer,String > days = new Hashtable < Integer,String >(); // Как добавить пары «ключ / значение» в Hashtable? days.put(1,"Sunday"); days.put(2,"Monday"); days.put(3,"Tuesday"); days.put(4,"Wednesday"); days.put(5,"Thursday"); days.put(6,"Friday"); days.put(7,"Saturday"); // Как проходить через Hashtable? for(Map.Entry m:days.entrySet()){ System.out.println(m.getKey()+" "+m.getValue()); } } }
Выход
7 Saturday 6 Friday 5 Thursday 4 Wednesday 3 Tuesday 2 Monday 1 Sunday
Источник: http://net-informations.com/Java/cJava/hashmap.htm