繁体   English   中英

Java 8 HashTable与HashMap冲突处理

[英]Java 8 HashTable vs HashMap Collision Handling

我想澄清一下Java 8中的hashtable和hashmap之间的区别。

据我所知,HashTable的功能类似于HashMap,但具有线程安全性,并且不允许空键或空值。 我知道Java 8更新了HashMap类,以便在发生冲突时,而不是创建存储桶中具有相同哈希码的项目的链表,而是创建树。

哈希表也是如此吗? 甚至在发生碰撞之前,树是默认的存储方法吗? (例如,将第一个可放入桶中的物品放在那里时,它只是没有分支的树根。)

另外,java如何确保哈希表是线程安全的? 当两个线程尝试并发访问数据时,是否会创建队列?

哈希表也是如此吗?

没有。

甚至在发生碰撞之前,树是默认的存储方法吗? (例如,将第一个可放入桶中的物品放在那里时,它只是没有分支的树根。)

号的HashMap类有一个名为恒定TREEIFY_THRESHOLD (值8)。

Javadoc说: “使用树而不是容器列表的容器计数阈值。将元素添加到具有至少这么多节点的容器中时,容器将转换为树”

另外,java如何确保哈希表是线程安全的?

Hashtable的javadoc明确表示: “与新的集合实现不同,Hashtable是同步的

当两个线程尝试并发访问数据时,是否会创建队列?

没有。

这个答案将非常特定于JDK中的当前实现,因此请记住这一点。

  1. 我知道Java 8更新了HashMap类,以便在发生冲突时,而不是创建存储桶中具有相同哈希码的项目的链表,而是创建树。

    哈希表也是如此吗?

不会。哈希表永远只会是链接列表的表。 Java开发人员没有为此用例更新Hashtable。 这也应该使您更清楚地知道您可能不应该使用Hashtable。

  1. 甚至在发生碰撞之前,树是默认的存储方法吗?

再次重申,这是Java 8,直到今天,但是,这不是默认行为。 一旦存储桶条目达到8个链接元素 ,HashMap就会将该链接列表转换为二叉树。

  1. 另外,java如何确保哈希表是线程安全的? 当两个线程尝试并发访问数据时,是否会创建队列?

通过使每个方法同步(即,每个线程将在该方法上排队),而另一个线程当前正在访问Hashtable的任何方法。 如果您要执行原子投放或原子计算之类的操作,则会导致很多问题。

如果您想要线程安全的映射HashMap,请始终使用ConcurrentHashMap,而不要使用Hashtable。

从Hashtable的Java文档

如果发生“哈希冲突”,则单个存储桶会存储多个条目,这些条目必须按顺序搜索

因此,第一个问题的答案是“否”。 它不会创建任何树。

关于线程安全机制,Hashtable在每个读写方法上使用简单的同步。 如果您担心性能和线程安全性,最好查看ConcurrentHashMap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM