java8 HashMap分析

java8 HashMap分析

hashMap在Map集合中拥有无法替代的地位,工作中经常用到,hashMap也是面试必问,今天来学习一下

主要了解

  • hashMap原理内部结构
  • hashMap 中hashMap函数实现
  • hashMap扩容机制
  • hashMap put源码实现
  • 如何解决hash冲突

hashMap原理内部实现

java7 之前是采用数组+链表,但是在java8之后是:数值+链表+红黑树:

1.数组初始值为16,负载因子0.75,当数组长度超过16*0.75时,就会扩容
2.hash冲突时,就会在当前节点产生下一个节点,形成一个链表,链表的默认最大长度为8,当超过8时,链表就换转换成红黑树
3.当调用put方法时,首先会通过hash(key)得到hashCode值,为尽量保证hash值唯一,采用高16位和低16进行异或运算(使用异或运算更接近底层,提高效率

putVal方法内部逻辑4中情况

1.首先要初始化一个数组
2.计算数组下表,判断是hash存在冲突,没有冲突则把Node放在下标中
3.hash冲突,则存在3中情况
(1)当key相同,则把原来的Node覆盖掉
(2)当前冲突的节点就已经是红黑色(TreeNode)结构,则向红黑树中添加一个叶子节点
(3)当前节点是链表,则向链表添加一个节点,链表长度加1,如果链表长度大于等于8,则转换成红黑树


扩容

resize()方法实现初始化,和扩容功能
采用2倍扩容,数组的大小必须是2的n次幂,保证结果的分散性,判断当前容量是否大于2的30次方,以及扩容后是否大于2的30次方,没有大于则创建一个新的数组重新赋值(这个值只可能出现在两个地方,一个是原下表位置,另一个是原先标+容量的位置)到新的数组并返回


解决hash冲突

开放定址
链地址法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值