大家好呀,我是你们的小米,一个积极活泼的程序员小伙伴!今天我们聊聊Java面试中的常见问题——“HashMap是怎么解决哈希冲突的?”。相信不少人都对这个问题既熟悉又陌生,知道它很重要,但要讲清楚,可能还得捋一捋思路。别急,今天我们就通过一个小故事,轻松搞懂这个知识点!
HashMap的世界:存储的艺术
想象一个图书管理员阿牛,他需要管理一间藏书丰富的图书馆。为了快速找到书,阿牛决定设计一个存书系统:
- 书本编号(Key): 每本书都有独特的编号,类似HashMap的key。
- 书柜号(哈希函数): 阿牛通过某种算法,把书的编号转化为一个书柜号,这相当于HashMap的hashCode()。
- 书的位置(存储): 阿牛把书放进对应的书柜。
问题来了:哈希冲突
一天,阿牛发现编号 123 和 789 的两本书,居然被分配到同一个书柜里!这就是哈希冲突——不同的Key,经过哈希函数计算,得到了相同的Hash值。
这种情况在HashMap里并不罕见,因为HashMap的底层结构决定了哈希值会映射到一个固定大小的数组中,必然存在冲突的可能。那么阿牛该怎么办呢?
HashMap的解决方案
为了应对哈希冲突,阿牛想出了两种办法,分别对应HashMap在不同版本中的处理方式:
1. 链地址法(JDK 1.8之前的实现)
阿牛决定用链表解决问题。如果书柜里已经有书,他就直接在书柜旁边放一个篮子,把新书放进篮子里。
- 每次存书时,阿牛会先检查书柜里是否已经有书。如果有,就把新书添加到链表的尾部。
- 每次取书时,阿牛会按照链表依次查找,直到找到目标书。
在代码中,链地址法就是用链表存储同一个桶(bucket)中的所有Key-Va

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



