hashmap扩容(hashmap扩容原理是什么)

本文目录
hashmap扩容原理是什么
hashmap扩容原理是HashMap的方法是使用一个新的数组代替原有的数组。对原数组的所有数据进行重新计算插入新数组,之后指向新数组,如果扩容前数组已经达到最大了,那么将直接将阈值设置成最大整形return。
hashmap扩容的特点
加载因子越大空间利用越高,扩容前填充的元素越多,put操作较快,但是链表容易过长,hash碰撞几率较大,get操作较慢,加载因子越小get操作较快,链表短hash碰撞几率低,但是空间利用率低,put元素过多会导致频繁扩容影响性能。
我们在使用HashMap的时候,如果预先知道大概要操作的元素数量,最好给一个初始化值,首先尽量避免扩容,其次根据业务场景结合重要参数来设定一些值来提高使用效率,HashMap每次扩容增长一倍。
Java HashMap扩容的时候,为什么要把Entry链表反转
我觉得应该是效率问题,如何不做反转在重新计算hash值后将要获得当前链表的最后一个元素,然后对最后一个元素的next属性添加一个节点信息,但是如果反转的话就不用了。
例子:
void transfer(Entry newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry《K,V》 e : table) {
while(null != e) {
Entry《K,V》 next = e.next;
//重新计算hash值
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
//这个是反转的写法 start
e.next = newTable;
newTable = e;
e = next;
// 反转end
//这个是不反转的写法 start
Entry《K,V》 newEntry = newTable;
e.next = null;
if(newEntry != null){
while(true){
if(newEntry.next == null){
newEntry.next = e;
break;
}
newEntry = newEntry.next;
}
}else{
newTable = e;
}
e = next;
//不反转 end
}
}
}

更多文章:
在from子句中可以出现(如何在from 子句中嵌套查询下面的语句在access中出错!)
2026年10月11日 05:20
countif函数统计个数怎么用(countif函数怎么用 详解Excel中countif函数的使用方法)
2026年10月11日 03:30
正则匹配数字之前的字符(正则表达式如何匹配前面是数字、中间是“/”、后面也是数字,就像2/3专业的模式)
2026年10月11日 03:00
orlnsertbootmediinselected(我电脑开机显示这个是什么意思or insert boot media in select)
2026年10月10日 23:00
display的用法(display是什么意思 详解display的含义和用法)
2026年10月10日 22:00
html全部居中代码(怎么让网页居中显示,html如何让网页居中)
2026年10月10日 21:10




