在Java中,HashMap和Hashtable有哪些区别?

32 浏览
0 Comments

在Java中,HashMap和Hashtable有哪些区别?

在Java中,HashMapHashtable有哪些区别?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

请注意,许多答案都指出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);

0
0 Comments

HashMapHashtable在Java中有几个区别:

  1. Hashtable同步的,而HashMap不是。这使得HashMap更适合非线程应用程序,因为未同步的对象通常比同步的对象执行得更好。

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

  3. HashMap的一个子类是LinkedHashMap,因此,如果您希望有可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将HashMap替换为LinkedHashMap。如果您使用Hashtable,这将不那么容易实现。

由于同步对您不是问题,我建议使用HashMap。如果同步成为问题,您也可以看看ConcurrentHashMap

0