Java HashMap的原理、扩容机制、以及性能思考

时间:2020-02-05 09:50:41   收藏:0   阅读:72

Java HashMap

说明

此文档所介绍的HashMap是基于JDK1.8之后的。此文受到网上很多其他Java生态爱好者文章的影响,写此文的目的是系统的概括下HashMap,并把一些优秀文章的脉络连接起来起到目录作用。在此感谢优秀文章作者的启发,由于自身实力有限,若有纰漏之处还请评论指导。

原理(参考[1][3])

HashMap类似于HashTable,本质都是存储的键值对,也就是keyvaluekey用作存储初始索引,通过对其进行一系列运算把value映射存储到底层数据结构中。其存储的数据结构(JDK 1.8之后)如下:

如上图所示,每个数组是有存储的是一个链表或者红黑树(视情况而定) * 数组 * 链表 * 红黑树

graph LR;   key-->|进行Hash运算|key的hash值;   key的hash值-->|和hashMap的length-1进行&运算|数组下标index;   数组下标index-->|根据index存储该Entry也就是key, value|该index的数组元素数据结构被更新:链表或者红黑树插入该Entry;

扩容(参考[2])

* 当元素超过数组长度的75%就会发生扩容,既长度增加一倍。
* 默认的数组长度```DEFAULT _INITIAL_ CAPACITY```=16,默认的负载因子```DEFAULT LOAD FACTOR```=0.75;当键值对数量超过16 * 0.75 = 12时,就会触发扩容导致数组长度变为16 * 2 = 32。

注意:扩容后,每个键值对数据存储的索引下标需要重新计算。通过公式:keyHash&(newLength-1)。结果会变成:newIndex = oldIndex + 扩容增加的长度

性能(参考[4])

参考文章

原文:https://www.cnblogs.com/zhoujunjie/p/12262296.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!