Когда я должен использовать Hashtable против HashMap - PullRequest
24 голосов
/ 02 марта 2012

Это не вопрос о различиях между Hashtable и HashMap. Я понимаю, что объект Hashtable не может принимать значения null для записей ключа или значения, что он синхронизированный сбор, и что он использует немного меньше памяти, чем HashMap.

Мне интересно, в каких сценариях было бы более целесообразно использовать Hashtable вместо HashMap.

Ответы [ 5 ]

27 голосов
/ 02 марта 2012

Это не вопрос о различиях между Hashtable и HashMap

Ну, это действительно ...

Язадается вопросом о сценариях, в которых было бы более целесообразно использовать Hashtable вместо HashMap.

Именно тогда, когда вы хотите различия между этими двумя понятиями:

  • Когда вы хотите запустить на Java 1.1
  • Когда вы хотите, чтобы каждая операция была синхронизирована (получая вам форму безопасности потока, если вы никогда не выполняете итерациинад ним) - и по какой-то причине не хотят использовать Collections.synchronizedMap над HashMap
  • Когда вы не хотите иметь возможность хранить нулевые значения
  • Когда памятьразница на самом деле значительна (только после того, как вы доказали это так) - я даже не знал об этой разнице, лично ...
  • Когда вас заставилинеприятный API, который возвращает или принимает Hashtable (относительно редко, к счастью)

Я не могу вспомнить, когда в последний разкак и в этой ситуации, лично - я бы сказал, что крайне редко можно использовать Hashtable в современном коде Java.

14 голосов
/ 02 марта 2012

Никогда. Hashtable была оригинальной реализацией карты в Java 1. Ее обошли реализации Map. Конечно, Hashtable был изменен, чтобы соответствовать, но это не очень полезно.

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

7 голосов
/ 02 марта 2012

Я могу вспомнить только одну действительную причину - когда вы используете API, который требует этого, например, JNDI чрезвычайно раздражает InitialContext класс .

Кроме этого, яне вижу никакой веской причины использовать Hashtable вообще.Вы можете получить синхронизированную версию HashMap, используя Collections.synchronizedMap.

3 голосов
/ 02 марта 2012

Я вижу Hashtables только в старых приложениях / библиотеках.

Если вы можете, используйте ConcurrentHashMap или Collections.synchronizedMap, если вам нужна синхронизированная карта.

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29

1 голос
/ 02 марта 2012

Знание того, когда использовать один класс или структуру над другим, по сути означает понимание различий между ними и принятие решения о том, какой из них лучше всего подходит к рассматриваемой проблеме, исходя из этих различий.

Я понимаю, чтоHashtable объект не может принимать нулевые значения

Так что в ситуации, когда вам нужно хранить нулевые значения, Hashtable не будет подходящим.

Кроме того, в Hashtable,перечисление не является отказоустойчивым.Поэтому, если вам нужно иметь возможность изменять содержимое структуры при перечислении, Hashtable будет более подходящим.

...