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

江枫思渺然 提交于 2020-02-05 01:56:32

Java HashMap

说明

此文档所介绍的HashMap是基于JDK1.8之后的。此文受到网上很多其他Java生态爱好者文章的影响,写此文的目的是系统的由浅入深介绍下HashMap。在此感谢优秀文章作者的启发,由于自身实力有限,若有纰漏之处还请评论指导。

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

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

  • 数据结构 ava

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

  • 存储过程
graph LR;   key-->|进行Hash运算|key的hash值;   key的hash值-->|和hashMap的长度length-1进行&运算|数组下标index;   数组下标index-->|根据index存储该Entry也就是key, value|该index的数组;
* 对key进行hash运算,得到key的hash值。
* 把key的hash值和hashMap的长度length进行&运算,得到index,index即为数据的索引地址,例如0,1,2,3。
* 把value存到

扩容(参考[2])

性能(参考[4])

  • 存储长度设为2的整数次幂

  • 负载因子

  • 实践案例

参考文章

  • [1]https://blog.csdn.net/weixin_45290108/article/details/100056621
  • [2]https://blog.csdn.net/wohaqiyi/article/details/81448176
  • [3]https://blog.csdn.net/woshimaxiao1/article/details/83661464
  • [4]https://blog.csdn.net/cnq2328/article/details/60783708
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!