欢迎光临散文网 会员登陆 & 注册

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

2023-07-19 20:13 作者:XakHh  | 我要投稿

在Java的HashMap中,当一个桶(bucket)中的链表长度超过8时,会将该链表进行树化(转换为红黑树),以提高查找效率。但是,并不是所有的超过8的链表都会立即树化。

实际上,在进行树化之前,还需要判断当前HashMap中的桶的数量是否达到了64个。只有当桶的数量超过64时,才会进行树化操作。这是因为在桶数量较少时,使用链表的查找效率仍然比使用红黑树更高。

当发生桶扩容时,即添加新的桶时,需要对原来的元素进行重排。这是因为扩容会改变存储元素的桶索引,原本在同一个桶中的元素可能会散布到新的桶中。这个过程会重新计算元素的哈希值,并根据新的索引位置进行存储。在这个过程中,原本在一个链表中的元素可能会被拆分到多个链表中,因此原来的链表可能会变短。

需要注意的是,树化和桶扩容都是为了维护HashMap的性能和平衡。树化是为了在链表长度过长时提高查找效率,而桶扩容则是为了避免哈希冲突过多导致长链表的产生,以均衡元素在哈希桶中的分布。


为了保证HashMap的散列算法正常运行,确保n是2的幂次方有两种方法:

  1. 扩容时每次扩倍:HashMap在进行扩容时,会将当前的容量扩大为原来的两倍。这样扩容后的容量一定是2的幂次方。
  2. 带参构造时转换为大于指定长度的最近的2的幂次方:HashMap在使用带参构造函数时,会将指定的初始容量值转换为大于该值且最近的2的幂次方作为实际的容量。例如,如果指定的初始容量为7,HashMap会将容量设置为8。


千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java的评论 (共 条)

分享到微博请遵守国家法律