Каковы различия между 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();
}

Хэш-карта и хэш-таблица

Разве хеш-таблица не является картой, использующей хэширование... следовательно, хэш-карта?

Да, точно. В информатике карта — это функциональное требование к ассоциативному контейнеру: возможность отображать значения в ключи. Хеш-таблица — это метод реализации, обеспечивающий доступ к массиву сегментов с использованием индекса, возвращаемого при вызове хеш-функции для ключа. Они могут и часто используются вместе, но у вас может быть «карта», основанная, скажем, на сбалансированном двоичном дереве, и у вас может быть хеш-таблица, в которой хранится набор значений (таких, что ключи являются значениями, а нет "карта" пинг).

  1. Синхронизация или потокобезопасность: это самое важное различие между двумя. HashMap не синхронизирован и не является поточно-ориентированным. С другой стороны, HashTable является поточно-ориентированным и синхронизированным. HashMap следует использовать, если вашему приложению не требуется многопоточность, другими словами, hashmap лучше подходит для непотоковых приложений. HashTable следует использовать в многопоточных приложениях.

  2. Нулевые ключи и нулевые значения: Hashmap допускает один нулевой ключ и любое количество нулевых значений, в то время как Hashtable не допускает нулевые ключи и нулевые значения в объекте HashTable.

  3. Производительность: Hashmap намного быстрее и использует меньше памяти, чем Hashtable, так как предыдущий не синхронизирован. Несинхронизированные объекты часто намного эффективнее по сравнению с синхронизированными объектами, такими как Hashtable, в однопоточной среде.

  4. HashMap наследует класс AbstractMap, в то время как Hashtable наследует класс Dictionary.

  5. Существенным отличием HashMap от Hashtable является то, что Iterator в HashMap является итератором, работающим без сбоев, а перечислитель для Hashtable - нет, и выдает исключение ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме собственного метода удаления () метод. Но это не гарантированное поведение и будет выполнено JVM с максимальной отдачей. Это также важное различие между перечислением и итератором в Java.

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

Другие вопросы по тегам