В чем разница между Hashtable и словарем? - PullRequest
22 голосов
/ 19 марта 2012

В чем разница между Dictionary и Hashtable и как мне работать с классом Dictionary в Java?

Ответы [ 7 ]

21 голосов
/ 19 марта 2012

Dictionary является абстрактным базовым классом Hashtable. Оба все еще находятся в JDK для обратной совместимости со старым кодом. Ожидается, что мы будем использовать HashMap и другие реализации интерфейса Map, представленные в Java 1.2.

15 голосов
/ 19 марта 2012

Javadoc для Dictionary содержит ваш ответ.

Класс Dictionary является абстрактным родителем любого класса, такого как Hashtable, который отображает ключи на значения.

Вы не работаете напрямую с Dictionary, поскольку это класс abstract.

Также обратите внимание на следующее из той же документации:

ПРИМЕЧАНИЕ. Этот класс устарел.Новые реализации должны реализовывать интерфейс Map , а не расширять этот класс.

10 голосов
/ 19 марта 2012

Dictionary - абстрактный класс, суперкласс Hashtable.Вы не должны использовать Dictionary, поскольку оно устарело .Что касается Hashtable, то преимущество, которое он имел перед другими картами, такими как HashMap, заключалось в безопасности потоков, но с появлением ConcurrentHashMap начиная с Java 1.5, нет реальной причины использовать его больше - см. javadoc

Начиная с платформы Java 2 v1.2 этот класс был модифицирован для реализации интерфейса Map, что сделало его членом Java Collections Framework.В отличие от новых реализаций коллекции, Hashtable синхронизирован.Если поточно-ориентированная реализация не требуется, рекомендуется использовать HashMap вместо Hashtable.Если требуется высококонкурентная реализация, ориентированная на многопотоковое исполнение, то вместо Hashtable рекомендуется использовать ConcurrentHashMap.

В итоге : не использовать Dictionary илиHashtable, за исключением случаев, когда это действительно необходимо по соображениям совместимости, используйте либо HashMap, если вам не нужна безопасность потоков, либо ConcurrentHashMap, если ваша карта используется в параллельной среде.

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

Hashtable является реализацией Dictionary.Вы не можете использовать Dictionary напрямую, потому что это абстрактный класс.

Но вы не должны использовать либо, потому что они были заменены интерфейсом Map и реализующими классами, из которых HashMap является самым популярным.

2 голосов
/ 19 марта 2012

Класс Dictionary является абстрактным родителем любого класса, например Hashtable, который сопоставляет ключи со значениями. Каждый ключ и каждое значение - это объект. В любом объекте Dictionary каждый ключ связан не более чем с одним значением. Имея словарь и ключ, можно найти связанный элемент. Любой ненулевой объект может использоваться как ключ и как значение.

2 голосов
/ 19 марта 2012

Я нашел лекцию о принципах ООП, которая содержит ответ, который вы ищете:

http://www.clear.rice.edu/comp202/04-fall/lectures/lec23/

EDIT:

словарь Основной темой в вычислительной технике является тема хранения / поиска / удаления: хранить данные где-нибудь, чтобы впоследствии их можно было извлекать и отбрасывать, если они больше не нужны, и все это наиболее эффективным способом. Абстракция этих вычислительных действий воплощена в понятии так называемого словаря, выраженного в Java как интерфейс следующим образом.

Хеш-таблицы Хеш-таблица - это обобщение обычного массива. Когда количество фактически сохраненных ключей мало по сравнению с общим числом возможных ключей, хэш-таблицы становятся эффективными альтернатива прямой адресации массива, так как хеш-таблица обычно использует массив размера, пропорциональный количеству ключей на самом деле хранится. Вместо непосредственного использования ключа в качестве индекса массива, индекс массива вычисляется из ключа. При хешировании элемент с ключом k сохраняется в слоте h (k); то есть хеш-функция h используется для вычисления слота от ключа k. h отображает набор ключей U в слоты хэш-таблицы T [0..m-1]: h: U -> {0, 1, ..., m - 1}

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

Согласно словарю для словаря:

ПРИМЕЧАНИЕ. Этот класс устарел. Новые реализации должны реализовывать Интерфейс карты, а не расширение этого класса.

Hashtable тоже винтажный JDK 1.0. Вы должны предпочесть интерфейс Map и его более современные реализации: HashMap и TreeMap.

...