底层数据结构:数组+链表+红黑树
接下来的回答中要点出数组的作用,为啥会有冲突,如何解决冲突
。数组:存取元素时,利用key的hashCode来计算它在数组中的索引,这样在没有冲突的情况下,能让存取时间复杂度达到O(1)
。冲突:数组大小毕竟有限,就算元素的hashCode唯一,数组大小是n的情况下要放入n+1个元素,根据鸽巢原理,肯定会发生冲突
。解决冲突:一种办法就是利用链表,将这些冲突的元素链起来,当然在在此链表中存取元素,时间复杂度会提高为O(n)
油炸小波
接下来要能说出为什么在链表的基础上还要有红黑树
。树化目的是避免链表过长引起的整个HashMap性能下降,红黑树的时间复杂度是O(log(n))有一些细节问题可以继续回答,比如树化的时机[进阶]
。时机:在数组容量达到〉=64且链表长度〉=8时,链表会转换成红黑树
。如果树中节点做了删除,节点少到已经没必要维护树,那么红黑树也会退化为链表
2.4 HashMap原理(扩容)
扩容因子:0.75也就是3/4
。初始容量16,当放入第13个元素时(超过3/4)时会进行扩容。每次扩容,容量翻倍
。扩容后,会重新计算key对应的桶下标(即数组索引)这样,一部分key会移动到其它桶中