了解HashMap扩容机制(JDK8)

本文探讨了HashMap在Java 8中的扩容机制。内容包括:为何初始化HashMap时应指定大小,resize方法的工作流程,以及HashMap容量为何必须为2的幂次。在扩容过程中,HashMap会确保元素分布均匀,避免性能下降。此外,文章还提到HashMap容量的最大限制,防止无限扩容的问题。
摘要由CSDN通过智能技术生成

前言

最近做项目的时候,添加了阿里的代码规范扫描插件
扫描的时候指出我的HashMap未指定初始化大小,这是不规范的
推荐:HashMap集合初始化时, 指定集合初始值大小。
网上给的解释是:
不指定的话,hashMap的每次put,会去判断是否到达HashMap的阈值(桶的大小*0.75(负载因子) ),到达即调用resize方法,如果频繁的调用resize会影响性能
注意:桶大小不等于size,可能桶的值已经32了,而size只有15,size表示HashMap中条目(即键-值对)的数量。
HashMap关键属性

    //默认的桶数组大小=16
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
    //最大size(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了)
    static final int MAXIMUM_CAPACITY = 1 << 30;
    //负载因子(后面很多地方会用到)
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    
    //无参构造方法
    public HashMap() {
    
      //设置一个默认的负载因子,默认为0.75
  	  this.loadFactor = DEFAULT_LOAD_FACTOR;
    }
	// 例子
    Map<Object,Object> response=new HashMap<Object,Object>(int initialCapacity);

如果暂时无法确定hashMap的size,那么取默认值16
如果已知要存的大小,那么可以根据下面的式子求出HashMap大小
式子: initialCapacity = (预备存储的大小 / 负载因子) +1

resize方法流程图

在这里插入图片描述
1.第一次调用put方法

     Node<K,V>[] tab; Node<K,V> p; int n, i;
        //table就是桶数组,初始为null
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值