Ответ
Hashtable — устаревший синхронизированный класс (с Java 1.0). HashMap — несинхронизированная, современная реализация (с Java 1.2).
Основные различия:
-
Потокобезопасность (Thread-Safety):
Hashtable: Все методы синхронизированы (synchronized). Потокобезопасен, но с низкой производительностью из-за глобальной блокировки.HashMap: Методы не синхронизированы. Не потокобезопасен, но быстрее. Для многопоточного доступа используйтеConcurrentHashMapили внешнюю синхронизацию.
-
Допустимость null:
Hashtable: Не позволяет использоватьnullни в качестве ключа, ни в качестве значения. ВыбрасываетNullPointerException.HashMap: Позволяет одинnull-ключ и множествоnull-значений.
-
Наследование и итерация:
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. И будет тебе счастье, а не волнение ебать.