解答
在JDK1.7以及1.7版本之前,HashMap对数组元素即链表的查询确实是从头节点开始查询的,这样链表一旦长了,效率比较低也是意料之中。
而在1.8中对HashMap的数据结构进行了一定的优化,其中增加了一个阈值对数组元素进行判断是否有必要进行红黑树变形(红黑树是一种二叉查找树),一旦链表长度达到了阈值,其数据结构便会变形为红黑树,提高了查询效率,但插入的效率并没有链表头插法那么高,这也可能是HashMap底层为什么不用红黑树组成的数组的原因之一。
性能对比:
链表:插入复杂度O(1),查找复杂度O(n)
红黑树:插入复杂度O(logn),查找复杂度O(logn)
HashMap数组元素为链表的时候,插入直接使用头插,插入复杂度O(1);当链表较短时候,查找数据时对性能并没有什么影响,如果链表一长,查找起来就很影响性能了。
在Java8中,如果链表长度到达了8个,就会转化为红黑树,提高了查找的性能,但每次插入新的数据,都得维护红黑树的结构,复杂度为O(logn)。这样算是对查找和插入元素时性能的一个权衡,毕竟存起来就是用来查的。
帖子还没人回复快来抢沙发