简谈JDK8后HashMap里put方法的过程

一、JDK8后HashMap的底层原理

1、HashMap的底层基于哈希表实现的,JDK8后哈希表的底层是:数组+链表+红黑树。

二、简谈put方法的过程

1、用无参构造器创建HashMap对象的时候,JDK8之后,系统不会自动创建数组为成员变量table赋值。

2、hashmap在存储键值对数据时;会先判断存储节点的数组table是否为null,如果为null,就进行扩容,生成一个长度16位的数组为table赋值。


3、接下来,先将键值对数据的键值进行hashcode运算,后使用hashcode值除以数组的长度取余,算出它放在数组上的索引i;对table[i]进行判断,如果table[i]为null,直接把数据存上去


4、如果table[i]不为null,要判断新增的数据是否跟table[i]上的数据相同(用equals方法比较哈希值),如果相同,进行数据的覆盖。
5、如果不相同,要判断table[i]上是否有红黑树,如果有红黑树,直接在树中插入键值对。


6、如果tab[i]上没有红黑树,那就要判断是否是链表结构;所以要遍历链表。

7、  如果tab[i]上的数据节点没有指向下一个数据,那么代表链表上没有数据,直接将put进来的数据放到链表上

8、如果tab[i]上的数据节点有指向另外的数据,那么就要在遍历过程中看看链表上的数据会不会跟pui进来的数据相同同,如果相同,就进行覆盖。

9,遍历过程中得到链表的长度如果大于8,那么就会调用treeifyBin方法;在方法里判断数组table的长度是否达到最大值64。

9.1、如果不是,就会将进行扩容

9.2、 如果是,就会将链表转成红黑树

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值