Java中的HashMap和Hashtable之间有什么区别?
2022-08-31 01:22:59
Java中的HashMap
和Hashtable
之间有几个区别:
Hashtable
已同步,而 实际上并非如此。这对于非线程应用程序来说更好,因为未同步的对象通常比同步的对象性能更好。HashMap
HashMap
Hashtable
不允许键或值。 允许一个键和任意数量的值。null
HashMap
null
null
HashMap的子类之一是LinkedHashMap
,因此,如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将.如果您使用的是 .HashMap
LinkedHashMap
Hashtable
由于同步对您来说不是问题,因此我建议。如果同步成为一个问题,您还可以查看 ConcurrentHashMap
。HashMap
请注意,很多答案都表明哈希表是同步的。在实践中,这给你买的很少。同步在访问器/赋值器方法上将停止两个线程同时在映射中添加或删除,但在现实世界中,您经常需要额外的同步。
一个非常常见的成语是“检查然后放置” - 即在 中查找条目,如果它尚不存在,则添加它。这绝不是原子操作,无论您使用 还是 。Map
Hashtable
HashMap
等效同步可以通过以下方式获得:HashMap
Collections.synchronizedMap(myMap);
但是要正确实现此逻辑,您需要对表单进行额外的同步:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
即使迭代 一个 的条目(或由 获得的条目)也不是线程安全的,除非你也防止通过额外的同步来修改。Hashtable
HashMap
Collections.synchronizedMap
Map
ConcurrentMap
接口的实现(例如ConcurrentHashMap
)通过包含线程安全的检查然后行动语义来解决其中的一些问题,例如:
ConcurrentMap.putIfAbsent(key, value);