什么时候扩容
扩容必须满足两个条件
- 存放新值的时候当前已有元素的个数必须大于等于阈值
- 存放新值的当前数据发生hash碰撞(key计算的hash值换算出来的数组下表位置已经存在值)
源码解析
下面是put方法
public V put(K key, V value) {
//判断当前Hashmap(底层是Entry数组)是否存值(是否为空数组)
if (table == EMPTY_TABLE) {
inflateTable(threshold);//如果为空,则初始化
}
//判断key是否为空
if (key == null)
return putForNullKey(value);//hashmap允许key为空
//计算当前key的哈希值
int hash = hash(key);
//通过哈希值和当前数据长度,算出当前key值对应在数组中的存放位置
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
//如果计算的哈希位置有