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

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


当前回答

注意,很多答案都表明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);

其他回答

HashMap:它是java.util包中可用的类,用于以键和值格式存储元素。

Hashtable:它是一个在集合框架中被识别的遗留类。

HashMap:使用哈希代码对数组进行索引的Map接口的实现。哈希表:嗨,1998年来电话。他们想拿回他们的集合API。

说真的,你最好完全远离Hashtable。对于单线程应用程序,您不需要额外的同步开销。对于高度并发的应用程序,偏执的同步可能会导致饥饿、死锁或不必要的垃圾收集暂停。正如Tim Howland所指出的,您可以使用ConcurrentHashMap。

注意,很多答案都表明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);

HashMap和Hashtable都用于以键和值的形式存储数据。它们都使用哈希技术来存储唯一的键。但是HashMap和Hashtable类之间有很多不同,如下所示。

HashMap和HashTable

关于HashMap和HashTable的一些要点。请阅读以下详细信息。

1) Hashtable和Hashmap实现java.util.Map接口2) Hashmap和Hashtable都是基于哈希的集合。并致力于哈希。所以这些是HashMap和HashTable的相似性。

HashMap和HashTable之间的区别是什么?

1) 第一个区别是HashMap不是线程安全的,而HashTable是ThreadSafe的2) HashMap性能更好,因为它不是线程安全的。而Hashtable的性能并不是更好,因为它是线程安全的。因此多个线程不能同时访问Hashtable。