Java中HashMap和Hashtable之间的区别是什么?

对于非线程应用程序,哪个更有效?


当前回答

除了izb所说的,HashMap允许空值,而Hashtable不允许。

还要注意,Hashtable扩展了Dictionary类,作为Javadocs状态,该类已过时,已被Map接口取代。

其他回答

除了izb所说的,HashMap允许空值,而Hashtable不允许。

还要注意,Hashtable扩展了Dictionary类,作为Javadocs状态,该类已过时,已被Map接口取代。

同步或线程安全:

哈希映射不同步,因此不安全,如果没有适当的同步块,则无法在多个线程之间共享,而哈希表是同步的,因此是线程安全的。

空键和空值:

HashMap允许一个空键和任意数量的空值。Hashtable不允许空键或值。

迭代值:

HashMap中的迭代器是一个快速失败迭代器,而Hashtable的枚举器不是,如果任何其他线程通过添加或删除除迭代器自己的remove()方法之外的任何元素来修改映射结构,则抛出ConcurrentModificationException。

超级类和传统:

HashMap是AbstractMap类的子类,而Hashtable是Dictionary类的子级。

性能:

由于HashMap不同步,因此与Hashtable相比,它更快。

参考http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java有关Java集合的示例、面试问题和测验

Hashtable类是同步的,也就是说,它被设计用于处理多线程或多线程进程的应用程序。在应用程序到进程的经典情况下,同步类的效率较低,因此Hashmap类通常更快。HashTable类不接受Null值(对于键或值),而HashMap类允许单个键为Null,并尽可能多地为Null。

HashTable和HashMaps有5个基本区别。

映射允许您迭代和检索键、值以及两个键-值对,而HashTable不具备所有这些功能。Hashtable中有一个函数contains(),使用起来非常混乱。因为contains的意思稍有偏差。它是指包含键还是包含值?很难理解。在Maps中,我们有ContainsKey()和ContainsValue()函数,这两个函数非常容易理解。在hashmap中,您可以在迭代时安全地删除元素。因为这在哈希表中是不可能的。HashTables默认情况下是同步的,因此可以轻松地与多个线程一起使用。默认情况下,as HashMaps不同步,因此只能用于单个线程。但您仍然可以使用Collections-util类的synchronizedMap(Mapm)函数将HashMap转换为synchronized。HashTable不允许空键或空值。其中作为HashMap允许一个空键和多个空值。

除了已经提到的差异之外,应该注意的是,自从Java8以来,HashMap动态地用TreeNodes(红黑树)替换每个bucket中使用的Nodes(链表),因此即使存在高哈希冲突,搜索时最坏的情况也是

HashMap的O(log(n))与Hashtable中的O(n)。

*上述改进尚未应用于Hashtable,而仅应用于HashMap、LinkedHashMap和ConcurrentHashMap。

仅供参考,目前,

TREEIFY_THRESHOLD=8:如果存储桶包含8个以上的节点,则链接列表将转换为平衡树。UNTREEIFY_THRESHOLD=6:当存储桶太小(由于删除或调整大小)时,树将转换回链接列表。