HashMap
底层结构,1.7与1.8异同
1.7:数组+链表
1.8:数组+(链表 或 红黑树)
为什么要使用红黑树?为什么不一开始就树化?树化的阈值为什么是8?什么时候会树化?什么时候退化成链表?
- 查找效率高、避免DoS攻击
- 链表比较短的时候 不需要树化,红黑树占用内存多一些
- 在负载因子0.75的情况下,长度超过8的链表出现概率极低(0.00000006),所以选择8是为了让树化几率足够小
- 当一个链表长度大于8的时候,会先扩容(所以链表长度是有可能超过8的),来解决链表过长问题
如果集合长度超过64,依然存在链表长度大于8,才会转变为红黑树。
- 集合扩容时可能会拆分红黑树,当树元素<=6就会退化链表
- remove树节点时,若root、root.left、root.right、root.left.left有一个为Null,也会退化为链表