В чем разница между Hashtable и HashMap в Java?

Ответ

Hashtable — устаревший синхронизированный класс (с Java 1.0). HashMap — несинхронизированная, современная реализация (с Java 1.2).

Основные различия:

  1. Потокобезопасность (Thread-Safety):

    • Hashtable: Все методы синхронизированы (synchronized). Потокобезопасен, но с низкой производительностью из-за глобальной блокировки.
    • HashMap: Методы не синхронизированы. Не потокобезопасен, но быстрее. Для многопоточного доступа используйте ConcurrentHashMap или внешнюю синхронизацию.
  2. Допустимость null:

    • Hashtable: Не позволяет использовать null ни в качестве ключа, ни в качестве значения. Выбрасывает NullPointerException.
    • HashMap: Позволяет один null-ключ и множество null-значений.
  3. Наследование и итерация:

    • Hashtable наследует от устаревшего класса Dictionary и использует перечисление (Enumeration) для итерации.
    • HashMap наследует от AbstractMap и является частью современной Collections Framework. Использует Iterator.

Пример, показывающий разницу с null:

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(null, "value"); // OK
hashMap.put("key", null);   // OK

Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put(null, "value"); // Выбросит NullPointerException
hashtable.put("key", null);   // Выбросит NullPointerException

Рекомендация: Hashtable считается легаси-кодом. В современной разработке всегда используйте HashMap. Для потокобезопасных сценариев используйте ConcurrentHashMap.

Ответ 18+ 🔞

А, ну ты смотри, опять про эту древнюю хрень вспомнили! Hashtable, блядь, это как дедушкин "Запорожец" в мире коллекций — вроде ездит, но все вокруг уже на современных тачках, а ты сидишь и ключом заводишь.

Слушай, вот тебе суровая правда, чтобы ты не наступал на те же грабли.

Hashtable — это старый, потный дед из Java 1.0, который всего боится. Он синхронизированный, то есть, грубо говоря, он такой: "Опа, два потока сразу? А ну по одному, суки, заходите, я вас тут сам всех обслужу!" И из-за этой своей паранойи он овердохуища медленный, потому что вешает замок на всю свою тушу.

HashMap — это его шустрый внучок (появился в 1.2), который говорит: "Да похуй! Я быстрый!". Синхронизации у него нет, поэтому в однопоточке он летает. Но если к нему с разных потоков полезть — будет пиздец и рассыпется всё, как карточный домик. Для таких случаев есть крутой пацан ConcurrentHashMap — он умный, он блокирует не всю таблицу, а только маленький кусочек.

А теперь, внимание, самый жирный пиздец, где все обламываются!

Про null-ы, ёпта!

  • Hashtable: Конченый максималист. Ему суй null в ключ или в значение — он тебе сразу в ебало NullPointerException кинет. Вообще нихуя не терпит.
  • HashMap: Пофигист. null-ключ? Один пожалуйста. null-значения? Да хоть все. Главное — ключ null только один, а то он с ума сойдет.

Вот, смотри, как это выглядит в коде, тут всё честно:

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(null, "value"); // Норм, живём
hashMap.put("key", null);   // Тоже ок, похуй

Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put(null, "value"); // БАБАХ! NullPointerException, пошёл нахуй!
hashtable.put("key", null);   // Снова БАБАХ! Иди отсюда!

Итог, блядь, простой до нельзя: Забудь про Hashtable как про страшный сон. Это легаси, музейный экспонат. Для 99% случаев бери HashMap. А если твоё приложение — это такой общественный туалет, куда все одновременно писают (многопоточность), то бери ConcurrentHashMap. И будет тебе счастье, а не волнение ебать.