-
底层数据结构,1.7和1.8有何不同?
1.7 数组+链表
1.8 数组+(链表|红黑树)——当链表中元素比较多时,链表会转换成红黑树,红黑树中元素减少了,也会退回为链表 -
为何要用红黑树,为何一上来不树化(数组+链表,只有当链表长度超过一个阈值之后,才会转换成红黑树),树化阈值(链表长度超过一个阈值之后)为何是8,何时会树化(是不是一超过这个阈值,就立马变成红黑树,还是有其它的条件呢),何时会退化为链表?
红黑树特点:左子树的节点元素比根节点元素小,右子树的节点元素比根节点元素大a. 为何要用红黑树:
1.7中如果链表太长,会影响整个HashMap的性能,1.8引入红黑树之后,在链表比较长的时候,它会对HashMap的性能没有太大的影响。b. 何时树化:
1. 链表长度超过阈值8;
2. 整个数组长度大于等于64;c. 为何一上来不树化:
红黑树用来避免DoS攻击,防止链表超长时性能下降,树化应当是偶然现象;
在链表比较短时,链表的性能要比红黑树的性能好,并且红黑树占用的内存比较多;只有链表比较长的情况下,才会远远不如红黑树,如非必要,尽量还是使用链表;d. 树化阈值为何是8:
hash值如果足够随机,则在hash表内按泊松分布,在负载因子0.75的情况下,长度超过8的链表出现概率是0.0000006,选择8就是为了让树化几率足够小;c. 退化情况:
1. 在扩容时如果拆分树时,树元素个数<=6 则会退化链表;
2. remove树节点时,若root、root.left、root.right、root.left.left有一个为null,也会退化为链表(在remove之前检查,root:根节点);
HashMap(底层数据结构,1.7和1.8有何不同)
于 2022-04-25 18:46:16 首次发布