在Java中,HashMap和Hashtable有哪些区别?
在Java中,HashMap和Hashtable有哪些区别?
在Java中,HashMap
和Hashtable
有哪些区别?
对于非线程应用程序,哪个更高效?
admin 更改状态以发布 2023年5月22日
请注意,许多答案都指出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
不是。这使得HashMap
更适合非线程应用程序,因为未同步的对象通常比同步的对象执行得更好。 -
Hashtable
不允许null
键或值。HashMap
允许一个null
键和任意数量的null
值。 -
HashMap的一个子类是
LinkedHashMap
,因此,如果您希望有可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将HashMap
替换为LinkedHashMap
。如果您使用Hashtable
,这将不那么容易实现。
由于同步对您不是问题,我建议使用HashMap
。如果同步成为问题,您也可以看看ConcurrentHashMap
。