HashMap底层数据结构
HashMap底层实现采用了哈希表,哈希表是一种非常重要的数据结构
哈希表的基本结构
本质上就是数组+链表
数组的特点:
-
占用空间连续
-
寻址容易
-
查询速度快
-
增加和删除效率低
链表的特点:
-
占用空间不连续
-
寻址困难
-
查询速度慢
-
增加和删除效率非常高
哈希表就是结合了数组的优点和链表的优点
HashMap源码关键点
-
一个Entry节点数组---核心数组(位桶数组)
-
Node里面描述了每个节点里面存着什么内容:
-
hash值
-
key值
-
value值
-
下一个节点
-
上述是1.6的源码
JDK8以后将hashmap又做了优化---数组+链表+红黑树
hashmap存储原理:
HashMap键值对转换过程:
-
当创建了一个键对象和一个值对象的时候:
-
会调用Object类里面的hashcode方法---本地方法,底层是C语言写的
-
生成一个对应的hashcode码
-
-
通过hashcode的值结合可自写的hash算法算出---hashcode值和位桶数组的索引的对应关系
-
然后根据算hashcode转换成的位桶数组的索引值将对象放入位桶数组中
-
如果两个hashcode值算出的索引一致
-
在第一个对象后用next指向第二个对象---hashmap的结构
-
hashmap结构如图:
-
-
用next进行指向
-
-
整个存储过程是:
在这个过程当中可以进行优化的点:---hashcode转换成索引下标的算法优化
散列码---让位桶数组利用效率更高