一、hashMap默认初始容量是多少?
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//默认为16
static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量为2的30次幂
static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认加载因子为0.75
二、hashMap put的原理
1、首先计算key的hash值()
2、根据hash值计算数组下标
数组下标=(n - 1) & hash
n为数组长度。
3、查询数组中是否存在该下标(tab[i = (n - 1) & hash]))
1)如果不存在则进行newNode,把新new的node放在数组中
2)如果存在,循环遍历此链表中此key是否存在源码为(k = e.key) == key || (key != null && key.equals(k))),
如果存在此key那么更新该key的值,
如果不存在此key,那么newNode放到该数组下标下链表的最后一个节点
4、put的时候,会判断table的容量是否足够,如果不够,会进行扩容。
注意:如果当前table的容量已经最大了MAXIMUM_CAPACITY = 1 << 30;那么不再进行扩容,只是调账阀值为最大int 的最大值 2的31次幂减1。
扩容的大小为原来table的两倍,阀值也是原来的两倍,
扩容后,原数组中的数据,(e.hash & oldCap)与运输后是0的话索引没变,是1的话索引变成“原索引+oldCap”;