Когда следует использовать Hashtable или HashMap
Это не вопрос о различиях между Hashtable
и HashMap
. Я понимаю, что объект Hashtable
не может принимать значения null
для записей ключа или значения, что является синхронизированной коллекцией и что она использует немного меньше памяти, чем HashMap
.
Мне интересно о сценариях, где было бы более целесообразно использовать Hashtable
вместо HashMap
.
Ответы
Ответ 1
Это не вопрос о различиях между Hashtable
и HashMap
Ну это действительно...
Мне интересно о сценариях, где было бы более целесообразно использовать Hashtable
вместо HashMap
.
Точно, когда вам нужны различия между ними:
- Если вы хотите запускать Java 1.1
- Если вы хотите, чтобы каждая операция была синхронизирована (вы получаете форму безопасности потоков, пока вы никогда не перебираете ее) - и по какой-то причине не хотите использовать
Collections.synchronizedMap
над HashMap
- Если вы не хотите сохранять нулевые значения
- Когда разница в памяти действительно значительна (только после того, как вы это доказали) - я даже не знал об этой разнице лично...
- Когда вы вынуждены противным API, который возвращает или принимает
Hashtable
(относительно редко, к счастью)
Я не могу вспомнить последний раз, когда я был в этой ситуации, лично - я бы сказал, что исчезающе редко бывает подходящим использовать Hashtable
в современном Java-коде.
Ответ 2
Никогда.
Hashtable была оригинальной реализацией карты в Java 1. Она была охвачена реализациями Map. Конечно, Hashtable был модифицирован для соответствия, но это не очень полезно.
У него есть основная проблема в том, что он синхронизирован. Это означает, что он будет медленным в любых обстоятельствах, когда он разделяется между потоками. ConcurrentHashMap - лучший выбор в этой ситуации. Если вы работаете в одном потоке, тогда несинхронизированный HashMap является лучшим выбором.
Ответ 3
Я могу придумать только одну действительную причину - когда вы используете API, который этого требует, например JNDI сильно раздражает InitialContext
class.
Кроме этого, я не вижу оснований использовать Hashtable
вообще. Вы можете получить синхронизированную версию HashMap
с помощью Collections.synchronizedMap
.
Ответ 4
Я вижу только 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
Ответ 5
Знание того, когда использовать один класс или структуру над другим, в основном понимает различия между ними и определяет, какой из них лучше всего подходит для этой проблемы на основе этих различий.
Я понимаю, что объект Hashtable не может принимать нулевые значения
Итак, в ситуации, когда вам нужно сохранить нулевые значения, Hashtable
не подходит.
Кроме того, в Hashtable
перечисление не является отказоустойчивым. Поэтому, если вам нужно изменить содержание структуры при перечислении, более подходящим будет Hashtable
.