Каковы различия между Hashmap против Hashtable в теории?

Существуют ли различия между хэшмапом и хеш-таблицей в теории?

Я не имею в виду конкретные определения, данные в Java (или реализации), но теоретически. Это не хэш-таблица, которая использует хеширование... следовательно, hashmap?

Ответ 1

Согласно Wikipedia, они совпадают:

При вычислении хэш-таблица (хэш-карта) представляет собой структуру данных, используемую для реализации ассоциативного массива (...)

Согласно Wikibooks, это то же самое:

Хэш-таблица или хэш-карта - это структура данных, которая связывает ключи со значениями.

В некотором ответе на fooobar.com/questions/25156/... также указывается:

Hashtable часто полезен (их также называют хэшмапами) (...)

Ответ 2

** Карта хэшей и хеш-таблица **

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();
    }
  • Оба относятся к интерфейсу карты. Ключи - не дублируются.
  • Хэш-карта  не синхронизирована, но мы можем преобразовать ее в synchronizedMap. Он позволяет использовать один нуль для ключа и значения, если его больше переопределяет.
  • Хэш-таблица  синхронизирована, поскольку она является устаревшим классом. Он не допускает нулевого истребителя по ключу/значению.
  • Hash - не гарантирует порядок вставки

Ответ 3

  • Синхронизация или потоковая безопасность: это самое важное различие между двумя. 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.