首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么哈希图拆分方法需要在loHead.treeify (选项卡)之前确定(hiHead!= Null)

哈希图拆分方法需要在loHead.treeify之前确定hiHead不为Null的原因是为了确保在进行哈希图拆分时,能够正确地将元素分配到新的哈希桶中。

在哈希图拆分过程中,首先会创建一个新的哈希桶,然后将原哈希桶中的元素重新分配到新的哈希桶中。这个过程需要保证原哈希桶中的元素能够正确地分配到新的哈希桶中,否则可能会导致元素分布不均匀,影响哈希表的性能。

在哈希图拆分方法中,loHead和hiHead分别表示原哈希桶中的低位链表和高位链表。loHead.treeify表示将低位链表转化为树形结构,而hiHead表示高位链表。在进行哈希图拆分时,需要先确定hiHead不为Null,即高位链表不为空,才能进行拆分操作。

这是因为在哈希图拆分过程中,会先将原哈希桶中的元素重新分配到新的哈希桶中,其中低位链表的元素会保持在原哈希桶中,而高位链表的元素会被移动到新的哈希桶中。如果hiHead为Null,即高位链表为空,那么就没有需要移动的元素,也就没有必要进行哈希图拆分操作。

因此,为了确保哈希图拆分的正确性和有效性,需要在loHead.treeify之前确定hiHead不为Null,以保证元素能够正确地分配到新的哈希桶中,从而保证哈希表的性能和稳定性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java源码系列4——HashMap扩容时究竟对链表和红黑树做了什么?

= null; // 链表2存放在高位(原索引 + 旧数组长度) Node hiHead = null, hiTail = null; Node next; do { next...这波操作是不是很666,为什么 2 的整数幂 - 1可以作 & 操作可以代替求余计算,因为 2 的整数幂 - 1 的二进制比较特殊,就是一串 11111,与这串数字 1 作 & 操作,结果就是保留下原数字的低位...= null) // (else is already treeified) loHead.treeify(tab); } } // 树化高位链表...= null) hiHead.treeify(tab); } } } 从源码可以看出,红黑树的拆分和链表的逻辑基本一致,不同的地方在于,重新映射后...,会将红黑树拆分成两条链表,根据链表的长度,判断不需要把链表重新进行树化。

85840
  • HashMap 源码详细分析(JDK1.8)

    HashMap 允许 null 键和 null 值,在计算键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。...0 : (h = key.hashCode()) ^ (h >>> 16); } 看这个方法的逻辑好像是通过位运算重新计算 hash,那么这里为什么要这样做呢?...为什么不直接用键的 hashCode 方法产生的 hash 呢?大家先可以思考一下,我把答案写在下面。 这样做有两个好处,我来简单解释一下。...对于树形节点,拆分红黑树再映射。对于链表类型节点,则需先对链表进行分组,然后再映射。需要的注意的是,分组后,组内节点相对位置保持不变。...= null) loHead.treeify(tab); } } // 与上面类似 if (hiHead !

    1.9K240

    HashMap 源码详细分析(JDK1.8)

    HashMap 允许 null 键和 null 值,在计算键的哈希值时,null 键哈希值为 0。HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。...0 : (h = key.hashCode()) ^ (h >>> 16); } 看这个方法的逻辑好像是通过位运算重新计算 hash,那么这里为什么要这样做呢?...为什么不直接用键的 hashCode 方法产生的 hash 呢?大家先可以思考一下,我把答案写在下面。 这样做有两个好处,我来简单解释一下。...对于树形节点,拆分红黑树再映射。对于链表类型节点,则需先对链表进行分组,然后再映射。需要的注意的是,分组后,组内节点相对位置保持不变。...= null) loHead.treeify(tab); } } // 与上面类似 if (hiHead !

    39930

    面试官:JDK1.8 HashMap扩容rehash算法是如何优化的?

    我们都知道HashMap扩容是通过resize来实现的,所以我们看看resize方法的实现 final Node[] resize() { Node[] oldTab..., loTail = null; Node hiHead = null, hiTail = null;...1)单个节点 其实重新进行hash寻址算法,找到对应数组的下标,放上就行了 2)链表 仔细阅读源码会发现,就是将之前的链表rehash之后重新拆分为了两个链表,一个链表rehash之后还是在当前的位置...index,另一个链表rehash之后的位置变成了index + oldCap,画个图理解一下 至于为什么可以分为两个链表,这里说明一下。...所以在JDK1.8的rehash算法优化就是对原来的链表或者红黑树进行拆分成两部分,然后分别挂在原来数组的位置和 数组的位置 + oldCap的位置,这样做就避免了大量的节点进行重新hash寻址算法和重新放到

    62030

    今日面试之HashMap考点

    loadFactor 加载因子是哈希表在其容量自动增加之前可以达到多满的一种饱和度百分比,其衡量了一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。..., loTail = null; Node hiHead = null, hiTail = null; Node<K...这个设计非常赞,因为 hash 值本来就是随机性的,所以 hash 按位与上 newTable 得到的 0(扩容前的索引位置)和 1(扩容前索引位置加上扩容前数组长度的数值索引处)就是随机的,所以扩容的过程就能把之前西冲突的元素再随机的分布到不同的索引去...其次,由于 JDK1.7 中发生西冲突时仅仅采用了链表结构存储冲突元素,所以扩容时仅仅是重新计算其存储位置而已,而 JDK1.8 中为了性能在同一索引处发生西冲突到一定程度时链表结构会转换为红黑数结构存储冲突元素...,故在扩容时如果当前索引中元素结构是红黑树且元素个数小于链表还原阈值(西冲突程度常量)时就会把树形结构缩小或直接还原为链表结构(其实现就是上面代码片段中的 split() 方法)。

    50940

    java集合介绍_java代码分析框架

    六、HashMap 添加元素 在之前获取下标的例子中,我们知道 put()方法依赖于 putVal()方法,事实上,包括 putAll()在内,所有添加元素的方法都需要依赖于 putVal()。...3.为什么key可以为null 我们回顾一下 hash()方法: (key == null) ?...= null && key.equals(k)); 因为可能存在哈希冲突,或者为 null 的 key,因此所以光判断哈希值是不够的,事实上,当我们试图添加或者找到一个 key 的时候,方法会根据三方面来确定一个唯一的...()算出来的值; 比较 equlas()是否相等:Object.equlas()方法在不重写的时候,默认比较的是内存地址; 比较 key 是否为 null为什么要重写equals和hashcode方法...equals和hashCode方法 HashMap 在get()和set()的时候都会通过 Object.equals() 和 Object.hashCode() 方法确定唯一 key。

    77030

    HashMap 夺命 14 问!

    喽,小伙伴们好。金三银四可能很多小伙伴都考虑换个环境,那么面试是少不了的,基础更加重要。...当溢出发生时,将所有溢出数据统一放到溢出区 注意开放定址法和再哈希法的区别是 开放定址法只能使用同一种 hash 函数进行再次 hash,再哈希法可以调用多种不同的 hash 函数进行再次 hash 04 为什么要在数组长度大于...只要两个元素的 key 计算的hash码值相同就会发生 hash 碰撞,jdk8 之前使用链表解决哈希碰撞,jdk8 之后使用链表+红黑树解决哈希碰撞 09 HashMap的put方法流程 以 jdk8..., loTail = null; //高位链表,存放扩容之后的数组的下标位置,=原索引+扩容之前数组容量...,那么键对象正确的重写这两个方法是非常重要的,这些类很规范的重写了hashCode()以及equals()方法 12 为什么 Map 桶中节点个数超过 8 才转为红黑树?

    33820
    领券