HashMap
- 底层数据结构,1.7与1.8有何不同?
- 1.7 数组+链表,1.8 数组+ (链表 | 红黑树)
- 为何要用红黑树,为何一上来不树化,树化阈值为何是8,何时会树化,何时会退化为链表?
- 链表太长会影响性能
- 链表短时,树化效率并不比链表高,占内存多
- 红黑树用来避免DoS攻击,防止链表超长时性能下降,树化应当是偶然情况,正常情况下链表长度不会超过8。hash值如果足够随机,则在hash表内按泊松分布,在负载因子0.75的情况下,长度超过8的链表出现概率是0.00000006,选择8就是为了让树化几率足够小。
- 条件1:链表长度是大于8,条件2:数组长度大于64。若条件1成立且数组长度小于64时会扩容
- 情况1:扩容后拆分树,树节点小于等于6。情况2:退化情况2: remove树节点时,移除前判断,若root、root.left、root.right、root.left.left有一个为null ,也会退化为链表
扩容、树化:元素个数超过数组的3/4时,会进行扩容,树化阈值是8,条件1:链表长度是大于8,条件2:数组长度大于64。若数组长度小于64时会扩容,万不得已才树化。