前言
最近做项目的时候,添加了阿里的代码规范扫描插件
扫描的时候指出我的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