hashmap的扩展机制是重新计算容量,用新的数组代替原始数组。重新计算原数组的所有数据,插入新数组,然后指向新数组;如果数组在容量扩展前达到最大值,则直接将阈值设置为最大整数返回。
本教程操作环境:windows7系统,java8a8a、Dell G3电脑。
什么是扩容(resize)?
扩容(resize):就是重新计算容量,不断向HashMap对象添加元素。当HashMap对象中的数组不能装载更多元素时,对象需要扩大数组的长度,以便装载更多元素。当然,Java中的数组不能自动扩展。方法是用新的数组代替现有的小容量数组,就像我们用小桶装水一样。如果我们想装更多的水,我们必须换一个大桶。
什么时候扩容?
当向容器添加元素时,会判断当前容器的元素数量,如果大于等于阈值(threshold),也就是说,当前容器中的元素数大于当前数组的长度乘以加载因子的值时,就会自动扩容。
hashmap扩容原理
hashMap扩容就是重新计算容量,不断向hashMap添加元素。当hashMap无法装载新元素时,对象需要扩大数组容量才能装入更多元素。
HashMap容量扩展的特点是加载因子越大,空间利用率越高,扩展前需要填充的元素越多,put操作越快,但链表容易过长,hash碰撞概率大,get操作慢。加载因子越小,获取操作越快,链表越短,hash碰撞概率越低。然而,空间利用率很低。put元素过多会导致频繁扩展,影响性能。
Hashmap的容量扩展原理:Hashmap的方法是用新数组代替原数组,重新计算原数组中的所有数据,插入新数组,然后指向新数组;如果数组在扩展前已经达到最大值,则直接将阈值设置为最大整数返回。
扩容的过程
下面使用源代码 图片 本文介绍了HashMap的扩展过程。
/**
* HashMap 添加节点
*
* @param hash 当前key生成的hashcodedey
* @param key 要添加到 HashMap 的key
* @param value 要添加到 HashMap value
* @param bucketIndex 桶,也就是说,这个要加 HashMap 数据对应于数组位置下的标记
*/
void addEntry(int hash, K key, V value, int bucketIndex) {
//数组扩容条件:1.现有的keyy-value mappings的数量大于等于阈值
// 2.底层数组的bucketindex坐标不等于nullll
if ((size