HashMap底层数据结构--面试

时间:2023-02-09 16:18:17

下面进行总结:HashMap在1.8之前使用 位桶 + 链表 采用链表解决冲突,在同一个hash值的链表都存储在同一个链表中,随着桶里面的数值越来越多,即哈希值相等的元素越来越多,这时进行查找就特别慢
HashMap1.8使用的是 位桶 + 链表 + 红黑色 当链表长度超过阈值(8)时就转化成红黑色存储,此时查找效率会大大提高,当链表数组的容量超过加载因子0.75,将链表扩大两倍,将原数组搬到新的链表中存储。
红黑树主要是把原来一个链表的数据分成奇偶两个子链表分别挂在新链表数组的散列位置,这样就减少了每个链表的长度,增加查找效率
下面主要是jdk1.8的数据接结构
首先来说一下HashMap与哈希表
底层围绕哈希表展开,哈希表的核心思想就是采用键值对的方式进行存储,让记录的关键字与存储位置建立一一映射,这种映射关系是通过某种函数计算出来的,我们称之为哈希函数。
其中哈希函数有六种实现方式:
前几种都是针对关键字进行计算的
1.直接构造法
2.数学分析法
3.平方取中法
4.折叠法
5.除留余数法 (h = k % m)
6.随机函数法 (利用随机函数)
其中最常用的当然是除留余数法
但是采用哈希存储方式也会有一定的问题,比如哈希冲突,解决方式:
1.开放地址法 H = (H + D) %M 根据d的取值不同又可以分为线性探测法和线性再散列发和伪随机序列
2.再哈希表 H = RH(key)即在地址冲突时计算另一个哈希函数地址,直到不再发生冲突为止
3.链地址法:存储所有哈希地址冲突的记录
4.公共溢出区法:将所有的哈希地址冲突记录在溢出表中
HashMap实现采用除留余数法形式的哈希函数和链地址解决哈希地址冲突,主要包括数据和链表 ,其中链表中定义类实现HashMap