HashMap为什么要引用红黑树
在JDK8中,HashMap的底层有数组+链表变为数组+链表+红黑树。主要是为了解决哈希冲突极端情况下的性能退化问题,同时也是一种防御性编程手段。
红黑树
红黑树有四大特征:
1.节点非黑即红。
2.根节点和叶子节点为黑色。
3.每个红色节点必须有两个黑色子节点。不能有两个连续的红色节点。
4.从任一节点到其所有子节点的最短路径都含有相同数量的黑色节点。
为什么选择红黑树
Java8引入红黑树后,在链表长度大于等于8后自动转换为红黑树,将查询/插入/删除效率由O(n)降低到了O(log(n))。
HashMap是一个需要频繁进行put和remove操作的容器,红黑树在插入删除时的旋转操作更少,平均性能更高,且内存占用更小。
AVL树相比起来虽然查询稍快,但是维护成本过高。不适合HashMap这种更新频繁的容器。
为什么不直接使用红黑树
1.红黑树会比链表占用更多的内存,且维护成本更高。
2.在长度小于8时,链表的速度比红黑树更快,且链表长度到达8的情况比较少见。
其他条件
当数组长度大于64时,链表才会转换为红黑树。
数组长度小于64时会优先进行扩容操作减少哈希冲突。
当红黑树节点数小于6时会退化为链表
浙公网安备 33010602011771号