Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
Java中HashMap和Hashtable之间的区别是什么?
对于非线程应用程序,哪个更有效?
当前回答
1.Hashmap和HashTable都存储键和值。
2.Hashmap可以将一个键存储为null。哈希表不能存储null。
3.HashMap未同步,但Hashtable已同步。
4.HashMap可以与Collection.SyncronizedMap(map)同步
Map hashmap = new HashMap();
Map map = Collections.SyncronizedMap(hashmap);
其他回答
注意,很多答案都表明Hashtable是同步的。在实践中,这几乎不会给你带来什么好处。同步是在访问器/赋值器上进行的。方法将停止同时从映射中添加或删除两个线程,但在现实世界中,您通常需要额外的同步。
一个非常常见的习惯用法是“先检查后放”,即在Map中查找条目,如果它不存在,则添加它。无论使用Hashtable还是HashMap,这都不是原子操作。
可通过以下方式获得等效同步的HashMap:
Collections.synchronizedMap(myMap);
但要正确实现此逻辑,您需要以下形式的额外同步:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
即使迭代Hashtable的条目(或Collections.synchronizedMap获得的HashMap)也不是线程安全的,除非您还通过额外的同步来防止Map被修改。
ConcurrentMap接口(例如ConcurrentHashMap)的实现通过包括线程安全检查然后动作语义(如:
ConcurrentMap.putIfAbsent(key, value);
Hashtable是同步的,而HashMap不是。这使得Hashtable比Hashmap慢。
对于单线程应用程序,请使用HashMap,因为它们在功能方面是相同的。
哈希表被认为是遗留代码。关于Hashtable,没有什么不能使用HashMap或HashMap的派生来完成的,所以对于新代码,我看不出任何理由返回Hashtable。
由于Java中的Hashtable是Dictionary类的一个子类,现在由于Map接口的存在而过时,所以不再使用它。此外,对于一个实现Map接口的类,没有什么是不能用Hashtable做的。
除了izb所说的,HashMap允许空值,而Hashtable不允许。
还要注意,Hashtable扩展了Dictionary类,作为Javadocs状态,该类已过时,已被Map接口取代。