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

之前面试时问了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如果有其他更有力度的答案,欢迎在评论区答复 (^_^)

你可能感兴趣的:(数据结构,Java,Java,HashMap)