hashmap浅析-扩容

补充部分:扩容涉及到扩容之后元素的整理问题,jdk8为了减少hashmpa冲突,使用了hash值和n进行&的操作,这么一来,同一个链表上的所有数据其实可以被划分为2类,一类是&操作之后为0的数据,保留在原位置,一类是&操作之后为1的数据,串起来放到新数组新位置上。

步骤1:首先判断是否为初次扩容,如果是,退出。如果不是,进入循环,循环遍历次数为数组中元素的个数

步骤2:(先把该节点赋值给e)判断数组中的当前节点是否为空,为空则进行下一轮循环

步骤3:如果不为空,则赋值为空,等待被GC回收。然后判断该节点是否有下一个节点,没有的话,则将该节点(通过e来获取)的hash值取出,来,并且与新数组的长度减1进行&运算,得到新的索引位置,再将e赋值给该位置。

步骤4:如果e结点后面仍然有兄弟节点,则会出现两种情况,要么后面是红黑树,要么就是链表,首先判断e节点是否为红黑树节点,是的话,在红黑树里面进行操作。

步骤5:不是红黑树的话,接下来要进行链表的移动,如补充部分所说的,同一类的连接到一起,给新数组赋值,赋值的时候只需要把各类的头部元素给数组索引位置就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值