Java中HashMap底层为什么是数组链表?

博客围绕面试中关于HashMap底层为何是数组链表及链表查询效率低的问题展开。介绍JDK1.7及之前,HashMap数组元素为链表,查询从头节点开始,效率低。JDK1.8增加阈值,链表长度达阈值会转为红黑树,提高查询效率,是对查找和插入性能的权衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前面试时问了HashMap的底层结构,详细见本人个人对HashMap和Hashtable底层实现的见解,入口如下:
Java中HashMap与HashTable底层的联系与区别

之后被问到HashMap底层为什么是数组链表呢?这样的话,链表一长,在链表中查询的效率不是很低吗?
我:(哑了)
最近看到一个比较有依据的答案,在此做一下答复。

HashMap底层为什么是数组链表呢?在链表中查询的效率不是很低吗?

在JDK1.7以及1.7版本之前,HashMap对数组元素即链表的查询确实是从头节点开始查询的,这样链表一旦长了,效率比较低也是意料之中。
而在1.8中对HashMap的数据结构进行了一定的优化,其中增加了一个阈值对数组元素进行判断是否有必要进行红黑树变形(红黑树是一种二叉查找树),一旦链表长度达到了阈值,其数据结构便会变形为红黑树,提高了查询效率,但插入的效率并没有链表头插法那么高,这也可能是HashMap底层为什么不用红黑树组成的数组的原因之一。
性能对比:

  • 链表:插入复杂度O(1),查找复杂度O(n)
  • 红黑树:插入复杂度O(logn),查找复杂度O(logn)
  • HashMap数组元素为链表的时候,插入直接使用头插,插入复杂度O(1);当链表较短时候,查找数据时对性能并没有什么影响,如果链表一长,查找起来就很影响性能了。
  • 在Java8中,如果链表长度到达了8个,就会转化为红黑树,提高了查找的性能,但每次插入新的数据,都得维护红黑树的结构,复杂度为O(logn)。这样算是对查找和插入元素时性能的一个权衡,毕竟存起来就是用来查的

此是本人个人愚见,各位dalao如果有其他更有力度的答案,欢迎在评论区答复 (^_^)

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值