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

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


当前回答

HashMap是模拟的,因此可以在GWT客户端代码中使用,而Hashtable不是。

其他回答

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

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

HashTable是同步的,如果您在单个线程中使用它,则可以使用HashMap,这是一个未同步的版本。未同步的对象通常性能更高。顺便说一句,如果多个线程同时访问HashMap,并且至少有一个线程在结构上修改了该映射,那么它必须在外部同步。您可以使用以下方法将未同步的映射打包到已同步的映射中:Map m=Collections.synchronizedMap(新HashMap(…));HashTable只能包含非空对象作为键或值。HashMap可以包含一个空键和空值。Map返回的迭代器是快速失败的,如果在创建迭代器之后的任何时候对映射进行了结构修改,则除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException。因此,在并发修改的情况下,迭代器会快速而干净地失败,而不是在未来某个不确定的时间冒着任意、非确定性行为的风险。而Hashtable的键和元素方法返回的枚举不会快速失败。HashTable和HashMap是Java集合框架的成员(自从Java 2平台v1.2以来,HashTable被改进以实现Map接口)。HashTable被认为是遗留代码,如果需要线程安全的高度并发实现,文档建议使用ConcurrentHashMap代替HashTable。HashMap不保证返回元素的顺序。对于HashTable,我想它是相同的,但我不完全确定,我找不到明确说明这一点的ressource。

我的小贡献:

Hashtable和HashMap之间的第一个也是最重要的区别是,HashMap不是线程安全的,而Hashtable是线程安全的集合。Hashtable和HashMap之间的第二个重要区别是性能,因为HashMap不同步,所以性能比Hashtable好。Hashtable与HashMap的第三个区别是Hashtable是过时的类,应该在Java中使用ConcurrentHashMap代替Hashtable。

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

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

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

仅供参考,目前,

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

HashTable和HashMaps有5个基本区别。

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