详解HashMap内部实现原理

内部数据结构
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
int hash;
从上面的数据结构定义可以看出,HashMap存元素的是一组键值对的链表,以什么形式存储呢
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
可以看出,是以数组形式储存,好的,现在我们知道,HashMap是以数组形式存储,每个数组里面是一个键值对,这个键值对还可以链接到下个键值对。如下图所示:
hashmap的添加
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
这里可以看出,hashmap的添加,首先根据一个entry的hash属性去查找相应的table元素i,然后看这个位置是否有元素存在,如果没有,直接放入,如果有,遍历此次链表,加到表尾
删除
final Entry<K,V> removeEntryForKey(Object key) {
if (size == 0) {
return null;
}
int hash = (key == null) ? 0 : hash(key);
int i = indexFor(hash, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> e = prev;
while (e != null) {
Entry<K,V> next = e.next;
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k)))) {
modCount++;
size--;
if (prev == e)
table[i] = next;
else
prev.next = next;
e.recordRemoval(this);
return e;
}
prev = e;
e = next;
}
return e;
}
删除的话,还是先根据hash在table数组中查找,然后再根据equals在链表中进行查找,这个也是为什么hashmap和hashset等以hash方式进行存储的数据结构要求实现两个方法hashcode和equalsd的原因
学过hash的人都知道,hash表的性能和hash冲突的发生次数有很大关系,但有不能申请过长的table表浪费空间,所以这里有了我们的resize函数
扩容机制
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
transfer(newTable, initHashSeedAsNeeded(newCapacity));
table = newTable;
threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}
这个方法会在put的时候调用,上面put的时候先调用 addEntry(hash, key, value, i);方法,然后看addEntry方法
void addEntry(int hash, K key, V value, int bucketIndex) {
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}
createEntry(hash, key, value, bucketIndex);
}
上面可以看出那么 HashMap 当 HashMap 中的元素个数超过数组大小 *loadFactor 时,就会进行数组扩容,loadFactor 的默认值为 0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为 16,那么当 HashMap 中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位 置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap 中元素的个数,那么预设元素的个数能够有效的提高 HashMap 的性能。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# HashMap
# HashMap原理
# HashMap详解及实例
# java无锁hashmap原理与实现详解
# Java HashMap的工作原理
# 详解 Java HashMap 实现原理
# 深入解析java HashMap实现原理
# java中HashMap的原理分析
# java HashMap 的工作原理详解
# Java 8中HashMap的底层原理解析
# Java HashMap底层实现原理
# Java中的HashMap实现原理深入理解
# 可以看出
# 键值
# 数据结构
# 链表
# 的是
# 组中
# 是一个
# 就会
# 还可以
# 遍历
# 会在
# 这是一个
# 的人都
# 希望能
# 就把
# 如果没有
# 然后再
# 所示
# 而这
# 谢谢大家
相关文章:
模具网站制作流程,如何找模具客户?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
清除minerd进程的简单方法
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
如何在IIS中新建站点并配置端口与IP地址?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何在IIS服务器上快速部署高效网站?
南平网站制作公司,2025年南平市事业单位报名时间?
移民网站制作流程,怎么看加拿大移民官网?
图册素材网站设计制作软件,图册的导出方式有几种?
建站之星在线客服如何快速接入解答?
广州美橙建站如何快速搭建多端合一网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
网站制作服务平台,有什么网站可以发布本地服务信息?
大连 网站制作,大连天途有线官网?
建站主机与虚拟主机有何区别?如何选择最优方案?
常州自助建站工具推荐:低成本搭建与模板选择技巧
动图在线制作网站有哪些,滑动动图图集怎么做?
Swift开发中switch语句值绑定模式
如何选择服务器才能高效搭建专属网站?
b2c电商网站制作流程,b2c水平综合的电商平台?
小型网站制作HTML,*游戏网站怎么搭建?
魔方云NAT建站如何实现端口转发?
定制建站如何定义?其核心优势是什么?
济南网站制作的价格,历城一职专官方网站?
深圳网站制作的公司有哪些,dido官方网站?
如何挑选最适合建站的高性能VPS主机?
宝塔新建站点报错如何解决?
如何快速搭建高效WAP手机网站吸引移动用户?
,石家庄四十八中学官网?
如何用y主机助手快速搭建网站?
建站主机选购指南:核心配置优化与品牌推荐方案
linux top下的 minerd 木马清除方法
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何在景安服务器上快速搭建个人网站?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
制作电商网页,电商供应链怎么做?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
,南京靠谱的征婚网站?
如何注册花生壳免费域名并搭建个人网站?
公司网站设计制作厂家,怎么创建自己的一个网站?
贸易公司网站制作流程,出口贸易网站设计怎么做?
如何在VPS电脑上快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。