Каковы различия между Hashmap и Hashtable в теории?
Есть ли различия между хеш-картой и хеш-таблицей в теории?
Я имею в виду не конкретные определения, данные в Java (или реализации), а теоретически. Разве хеш-таблица не является картой, которая использует хеширование... отсюда хеш-карта?
5 ответов
Согласно Википедии, они одинаковы:
В вычислениях хеш-таблица (hash map) - это структура данных, используемая для реализации ассоциативного массива (...)
Согласно Wikibooks, это то же самое:
Хеш-таблица или хеш-карта - это структура данных, которая связывает ключи со значениями.
В некоторых ответах по Stackru также говорится:
Hashtable часто полезен (их также называют hashmaps) (...)
Хэш-карта и хэш-таблица
- Оба принадлежат интерфейсу карты. Ключи - не могут быть дубликатами.
- Хэш-карта не синхронизирована, но мы можем преобразовать ее в synchronizedMap. Это позволяет максимум один нулевой ключ и любое количество нулевых значений.
- Хеш-таблица синхронизирована, так как это устаревший класс. Это не допускает нулевое значение либо в ключе / значении.
Начальная емкость Hashtable по умолчанию - 11, HashMap - 16.
Хеш - не обеспечит порядок вставки
- Для получения дополнительной информации см.
my stack post
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's eighter in key/value");
IllegalArgumentException iae = new IllegalArgumentException("nulls not accept");
iae.initCause(nul);
throw iae;
}
}
}.start();
}
Разве хеш-таблица не является картой, использующей хэширование... следовательно, хэш-карта?
Да, точно. В информатике карта — это функциональное требование к ассоциативному контейнеру: возможность отображать значения в ключи. Хеш-таблица — это метод реализации, обеспечивающий доступ к массиву сегментов с использованием индекса, возвращаемого при вызове хеш-функции для ключа. Они могут и часто используются вместе, но у вас может быть «карта», основанная, скажем, на сбалансированном двоичном дереве, и у вас может быть хеш-таблица, в которой хранится набор значений (таких, что ключи являются значениями, а нет "карта" пинг).
Синхронизация или потокобезопасность: это самое важное различие между двумя. HashMap не синхронизирован и не является поточно-ориентированным. С другой стороны, HashTable является поточно-ориентированным и синхронизированным. HashMap следует использовать, если вашему приложению не требуется многопоточность, другими словами, hashmap лучше подходит для непотоковых приложений. HashTable следует использовать в многопоточных приложениях.
Нулевые ключи и нулевые значения: Hashmap допускает один нулевой ключ и любое количество нулевых значений, в то время как Hashtable не допускает нулевые ключи и нулевые значения в объекте HashTable.
Производительность: Hashmap намного быстрее и использует меньше памяти, чем Hashtable, так как предыдущий не синхронизирован. Несинхронизированные объекты часто намного эффективнее по сравнению с синхронизированными объектами, такими как Hashtable, в однопоточной среде.
HashMap наследует класс AbstractMap, в то время как Hashtable наследует класс Dictionary.
Существенным отличием HashMap от Hashtable является то, что Iterator в HashMap является итератором, работающим без сбоев, а перечислитель для Hashtable - нет, и выдает исключение ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме собственного метода удаления () метод. Но это не гарантированное поведение и будет выполнено JVM с максимальной отдачей. Это также важное различие между перечислением и итератором в Java.
Основное отличие состоит в том, что к HashMap обращаются все потоки одновременно, и большинство из них вносят некоторые изменения, в результате чего некоторые изменения не будут видны для каждого отдельного потока (асинхронно) . Хеш-таблица синхронизируется, и только один поток может получить доступ и изменить хэш-таблицу.