2021-03-29

本文详细分析了JDK1.8之前和之后HashMap的Put方法实现,包括对象创建、数据添加流程及扩容策略。1.8前,新元素添加在旧元素前面;1.8后,新元素添加在后面。此外,当节点数量超过一定阈值时,1.8版HashMap会进行树化操作。
摘要由CSDN通过智能技术生成

大厂面试题——HhashMap底层源码,数据结构

在这里插入图片描述

JDK1.8之前Put方法 :

七上: 后添加的元素 会添加到旧元素的前面 旧元素 变为 新元素的子节点

在这里插入图片描述

1.创建完对象
 HashMap h = new HashMap();
  饿汉式不管需不需要都要开辟空间
 //开辟了一个长度为16的 Entry类型的数组
 //定义了阈值 12 
 
2.添加数据

  2.1key==null
    将数据添加到下标为0的位置
  2.2key!=null
   
    2.2.1 第一次添加 直接填入
    2.2.2 指定位置再次添加  hash 一样 key 不一样
                   
    2.2.3 指定位置再次添加  hash 一样 key 一样
          新的value 会替换旧的vaue 并 将 旧的value返回
            
     扩容:
     	1.size>= 阈值 && 即将插入数据的桶 不为bull  进行扩容
     	  
     	  扩容到原来的2倍
          

在这里插入图片描述

JDK1.8之后Put方法 :

八下: 后添加的元素 会添加到旧元素的后面

1.创建完对象
 HashMap h = new HashMap();
  懒汉式不开辟空间,只有需要调用时才会开辟空间
  只是给加载因子完成赋值
  
2.添加数据
  2.0 添加数据时才会开底层数组开辟空间 
    //开辟了一个长度为16的 Node类型的数组
     //定义了阈值 12 

  2.1key==null
    将数据添加到下标为0的位置
  2.2key!=null
    
    2.2.1 第一次添加 直接填入
    2.2.2 指定位置再次添加  hash 一样 key 不一样
                   
    2.2.3 指定位置再次添加  hash 一样 key 一样
          新的value 会替换旧的vaue 并 将 旧的value返回
            
     扩容:
     	1.size>= 阈值 && 即将插入数据的桶 不为bull  进行扩容
     	  扩容到原来的2倍
        2. 某一个位置节点的数量>=8 && 顺序表的长度>=64 将此节点下的node 进行树化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值