Существуют ли различия между хэшмапом и хеш-таблицей в теории?
Я не имею в виду конкретные определения, данные в Java (или реализации), но теоретически. Это не хэш-таблица, которая использует хеширование... следовательно, hashmap?
Существуют ли различия между хэшмапом и хеш-таблицей в теории?
Я не имею в виду конкретные определения, данные в Java (или реализации), но теоретически. Это не хэш-таблица, которая использует хеширование... следовательно, hashmap?
Согласно Wikipedia, они совпадают:
При вычислении хэш-таблица (хэш-карта) представляет собой структуру данных, используемую для реализации ассоциативного массива (...)
Согласно Wikibooks, это то же самое:
Хэш-таблица или хэш-карта - это структура данных, которая связывает ключи со значениями.
В некотором ответе на fooobar.com/questions/25156/... также указывается:
Hashtable часто полезен (их также называют хэшмапами) (...)
** Карта хэшей и хеш-таблица **
public static void main(String[] args) {
new Thread() {
@Override public void run() {
HashMap<String, Integer> hm = new HashMap<String, Integer>();
hm.put("key0", 10); // Compiler Widens.
hm.put("key1", null);
hm.put("key0", new Integer(16)); // Overridden.
hm.put(null, 20);
hm.put(null, 70);
hm.put(null, null);
System.out.println("HashMap : "+hm); // hm.toString()
Iterator<Entry<String, Integer>> it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
// we can conver HashMap to synchronizedMap
Collections.synchronizedMap(hm);
}
}.start();
new Thread() {
@Override public void run() {
Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
try {
ht.put("product1", 12);
ht.put("product2", 13);
ht.put("product2", 14);
// ht.put(null, 20);
// ht.put("product2", null);
System.out.println("hash Table : "+ht);
} catch (NullPointerException nul) {
System.out.println("HashTable will not accept null eighter in key/value");
IllegalArgumentException iae = new IllegalArgumentException("nulls not accept");
iae.initCause(nul);
throw iae;
}
}
}.start();
}
Синхронизация или потоковая безопасность: это самое важное различие между двумя. HashMap не синхронизирован, а не потокобезопасен. С другой стороны, HashTable потокобезопасен и синхронизирован. HashMap следует использовать, если ваше приложение не требует многопоточной задачи, другими словами hashmap лучше для приложений без потоковой передачи. HashTable следует использовать в многопоточных приложениях.
Нулевые ключи и нулевые значения: Hashmap позволяет использовать один нулевой ключ и любое количество нулевых значений, в то время как Hashtable не допускает нулевые ключи и значения null в объекте HashTable.
Производительность: Hashmap работает намного быстрее и использует меньше памяти, чем Hashtable, поскольку прежняя несинхронизирована. Несинхронизированные объекты часто намного лучше в производительности по сравнению с синхронизированным объектом, например Hashtable, в однопоточной среде.
HashMap наследует класс AbstractMap, а Hashtable наследует класс Dictionary.
Значительная разница между HashMap и Hashtable заключается в том, что Iterator в HashMap является отказоустойчивым итератором, в то время как перечислитель для Hashtable не является и бросает ConcurrentModificationException, если какой-либо другой поток модифицирует структуру структурно путем добавления или удаления любого элемента кроме Итераторов собственный метод remove(). Но это не гарантированное поведение и будет сделано JVM с наилучшими усилиями. Это также важное различие между Enumeration и Iterator в Java.