面试题答案
一键面试触发条件
- 链表长度:当HashMap中某个桶(bucket)内的链表长度达到8时,并且当前HashMap的容量(capacity)大于等于64,会触发链表向红黑树的转化。之所以要求容量大于等于64,是为了避免在HashMap容量较小时,频繁进行树化和反树化操作,因为树化操作本身是有一定性能开销的。
具体步骤
- 节点转换:遍历链表,将每个链表节点(
Node
)替换为树节点(TreeNode
)。TreeNode
继承自LinkedHashMap.Entry
,它除了包含键值对等基本信息外,还增加了用于红黑树的属性,如父节点、左右子节点、颜色等。 - 构建红黑树:在将链表节点替换为树节点的过程中,按照红黑树的插入规则构建红黑树。红黑树的插入规则会保证树的平衡性质,插入新节点后,可能会通过旋转和变色操作来维持红黑树的特性。例如,当插入节点破坏了红黑树的规则时,可能需要进行左旋、右旋、先左旋后右旋、先右旋后左旋等操作,同时改变相关节点的颜色,以确保红黑树的五个基本性质始终满足:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色。
- 每个叶节点(NIL节点,空节点)是黑色的。
- 如果一个节点是红色的,则它的子节点必须是黑色的。
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
选择红黑树而非其他平衡树结构的原因
- 实现复杂度:相比于AVL树,红黑树的实现相对简单。AVL树要求每个节点的左右子树高度差的绝对值最多为1,这使得在插入和删除节点时,AVL树可能需要进行更多的旋转操作来维持平衡。而红黑树通过较为宽松的平衡条件(上述提到的五个性质),在保持一定平衡的同时,降低了实现的复杂度。
- 性能:在实际应用场景中,对于HashMap这样的集合类,红黑树的平均性能与其他平衡树相当,甚至在某些情况下更优。因为红黑树不需要像AVL树那样时刻保持严格的高度平衡,这减少了在插入和删除操作时的旋转次数,从而提高了操作的效率。特别是在频繁进行插入和删除操作的场景下,红黑树的性能优势更为明显。
- 空间开销:红黑树在维持平衡时,相比于一些其他平衡树(如2 - 3树、2 - 3 - 4树等),不需要额外的空间来存储额外的节点类型或结构信息。虽然红黑树每个节点需要额外存储一个颜色属性,但总体空间开销相对较小,这对于HashMap这种需要存储大量数据的集合类来说是一个重要的考虑因素。