本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
提问:HashMap and a Hashtable in Java 有什么区别?
HashMap and a Hashtable in Java 有什么区别?
哪种对非线程应用更有效?
高分回答:
HashMap and a Hashtable in Java有几个区别:
-
Hashtable是同步的。这使得非线程应用程序更适合,因为未同步对象通常比同步对象(HashMapHashMap)执行更好。
-
Hashtable是不允许 key 或 value 为 null 的,HashMap的 key 和 value 都可以为 null! 先解释一下 Hashtable不支持 null key 和 null value 的原理: 如果我们 put 了一个 value 为 null 进入 Map,Hashtable会直接抛空指针异常:
-
HashMap 的子类之一是LinkedHashMap,因此,如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以轻松地将迭代顺序换成LinkedHashMap 。如果你使用Hashtable的话,这不会那么容易,需要遍历compare。
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{
复制代码
- 如果需要支持线程安全与性能兼顾的话,建议使用ConcurrentHashMap
高分回答:
请注意,许多答案状态是哈希表同步的。实际上,这对你没什么用处。同步是在访问器/突变体方法将停止两个线程同时添加或从地图上删除,但在现实世界中,你经常需要额外的同步。
一个非常常见的成语是"检查然后放"——即在条目中查找一个条目,如果不存在则添加它。这绝不是一个原子操作,无论你使用或。MapHashtableHashMap
通过:HashMap
Collections.synchronizedMap(myMap);
复制代码
但要正确实现此逻辑,您需要对表单进行额外的同步:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
复制代码
即使对"条目(或通过)获得的条目进行复读也不安全,除非您也通过额外的同步来防止修改。
HashtableHashMapCollections.synchronizedMapMap
复制代码
并发Map接口(例如并发HashMap)的实现通过包括线程安全检查然后行动语义来解决其中的一些问题,例如:
ConcurrentMap.putIfAbsent(key, value);
复制代码
文章翻译自 *.com/questions/2…
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️