📚 分类
集合
🕵🏽‍♀️ 问题描述
说一下HashMap的实现原理?
👨‍🏫 问题讲解
HashMap实现原理

HashMap的数据结构:底层使用hash表数据结构,即数组和链表或红黑树
1.当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
2.存储时,如果出现hash值相同的key,此时有两种情况。
  a.如果key相同,则覆盖原始值;
  b.如果key不同(出现冲突),则将当前的key-value放入链表或红黑树中(链表的长度大于8且数组长度大于64转换为红黑树)
3.获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

HashMap的jdk1.7和jdk1.8有什么区别

✔ JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
✔ JDK1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时并且数组长度达到64时,将链表转化为红黑树,以减少搜索时间。扩容resize()时,红黑树拆分成的树的结点数小于等于临界值6个,则退化成链表。
🏳️‍🌈 问题总结
1.说一下HashMap的实现原理?
✔ 底层使用hash表数据结构,即数组+(链表|红黑树)
✔ 添加数据时,计算key的值确定元素在数组中的下标
✔ key相同则替换不同则存入链表或红黑树中
✔ 获取数据通过key的hash计算数组下标获取元素

2.HashMap的jdk1.7和jdk1.8有什么区别
✔ JDK1.8之前采用的拉链法,数组+链表
✔ JDK1.8之后采用数组+链表+红黑树,链表长度大于8且数组长度大于64则会从链表转化为红黑树(红黑树节点数 <= 6的时候退化成链表)
📖 问题信息
📈 浏览次数:13 | 📅 更新时间:2025-12-01 22:02:07
📦 创建信息
🏷️ ID:89 | 📅 创建时间:2024-12-06 09:25:04