Hashtable和Dictionary有什么区别?

23

DictionaryHashtable有什么区别?在Java中如何使用Dictionary类?


谷歌上有很多好东西 - http://docs.oracle.com/javase/tutorial/collections/implementations/index.html - Vic
在stackoverflow上 - https://dev59.com/N3VC5IYBdhLWcg3whRgw - Vic
2
如果你有选择的话,应该使用Map而不是过时的Dictionary - assylias
1
Hashtable是HashMap的同步(线程安全)形式。 - kundan bora
1
如果您需要线程安全,可以使用ConcurrentHashMap。 - assylias
尽管这些数据结构是线程安全的,但使用它们并不意味着您的代码是线程安全的。您必须自己实现同步来使代码完全线程安全。 - kundan bora
7个回答

22

DictionaryHashtable的抽象基类。由于向后兼容旧代码,它们仍然存在于JDK中。我们应该使用在Java 1.2中引入的HashMap和其他实现了Map接口的实现。


1
值得一提的是,Hashtable是线程安全的,而HashMap则不是。请参见我的答案。 - assylias
Hashtable已经更新以实现Map。 - user2864740

16

Dictionary 的 javadoc 已经为您提供了答案。

Dictionary 类是任何映射键到值的类(比如 Hashtable)的抽象父类。

您不会直接使用 Dictionary,因为它是一个 abstract 类。

同时请注意同一文档中的以下内容:

注意:此类已过时。新实现应该实现 Map 接口,而不是扩展该类。


12

Dictionary是一个抽象类,也是Hashtable的超类。 由于已经被弃用,因此不建议使用Dictionary。 至于Hashtable,它相比其他映射(如HashMap)的优点在于线程安全性,但自Java 1.5引入了ConcurrentHashMap后,没有真正的理由再使用它-请参阅javadoc

从Java 2平台v1.2开始,此类被改装为实现Map接口,成为Java集合框架的一员。与新的集合实现不同,Hashtable是同步的。如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高并发实现,则建议使用ConcurrentHashMap代替Hashtable。

总之:除非出于兼容性原因真的必须使用DictionaryHashtable,否则应该使用HashMap(如果不需要线程安全),或ConcurrentHashMap(如果映射在并发环境中使用)。


3

HashtableDictionary 的一种实现。你不能直接使用 Dictionary ,因为它是一个抽象类。

但是你也不应该使用它们,因为它们已经被 Map 接口和实现类所取代,其中HashMap 最受欢迎。


2

我找到了一场关于面向对象编程原则的讲座,其中包含你所寻求的答案:

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

编辑:

字典 计算机科学中的一个重要主题是存储/检索/删除: 将数据存储在某处,以便稍后检索并在不再需要时丢弃,所有这些都以最有效的方式进行。 这些计算活动的抽象体现在所谓的字典概念中,Java中表示为接口,如下所示。

哈希表 哈希表是普通数组的一种泛化。 当实际存储的键的数量相对于可能的键的总数较小时,哈希表成为直接寻址数组的有效替代方法,因为哈希表通常使用与实际存储的键的数量成比例的大小的数组。 不使用键作为数组索引,而是从键计算数组索引。 使用哈希技术,具有键k的元素存储在插槽h(k)中; 即,哈希函数h用于从键k计算插槽。 h将键集U映射到哈希表T [0..m-1]的插槽中: h:U -> {0, 1,...,m-1}


2

字典类是任何将键映射到值的类(例如Hashtable)的抽象父类。每个键和每个值都是对象。在任何一个字典对象中,每个键最多关联一个值。给定一个字典和一个键,可以查找关联的元素。任何非空对象都可以用作键和值。


1
根据Dictionary的javadocs:

注意:此类已过时。新实现应该实现Map接口,而不是扩展此类。

Hashtable也是JDK 1.0的老式实现。你应该优先选择Map接口及其更现代化的实现:HashMap和TreeMap。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接