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

2022-08-31 01:22:59

Java中的HashMapHashtable之间有什么区别?

对于非线程应用程序,哪种方法更有效?


答案 1

Java中的HashMapHashtable之间有几个区别:

  1. Hashtable已同步,而 实际上并非如此。这对于非线程应用程序来说更好,因为未同步的对象通常比同步的对象性能更好。HashMapHashMap

  2. Hashtable不允许键或值。 允许一个键和任意数量的值。nullHashMapnullnull

  3. HashMap的子类之一是LinkedHashMap,因此,如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将.如果您使用的是 .HashMapLinkedHashMapHashtable

由于同步对您来说不是问题,因此我建议。如果同步成为一个问题,您还可以查看 ConcurrentHashMapHashMap


答案 2

请注意,很多答案都表明哈希表是同步的。在实践中,这给你买的很少。同步在访问器/赋值器方法上将停止两个线程同时在映射中添加或删除,但在现实世界中,您经常需要额外的同步。

一个非常常见的成语是“检查然后放置” - 即在 中查找条目,如果它尚不存在,则添加它。这绝不是原子操作,无论您使用 还是 。MapHashtableHashMap

等效同步可以通过以下方式获得:HashMap

Collections.synchronizedMap(myMap);

但是要正确实现此逻辑,您需要对表单进行额外的同步

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

即使迭代 一个 的条目(或由 获得的条目)也不是线程安全的,除非你也防止通过额外的同步来修改。HashtableHashMapCollections.synchronizedMapMap

ConcurrentMap接口的实现(例如ConcurrentHashMap)通过包含线程安全的检查然后行动语义来解决其中的一些问题,例如:

ConcurrentMap.putIfAbsent(key, value);