动态绑定和静态绑定的区别:
一个方法在编译时期解析,就称之为静态绑定,如果在运行时期解析,就称之为动态绑定
1,静态绑定在编译时期,动态绑定在运行时期
2,静态绑定只用到类型信息,方法的解析根据引用变量的类型决定,而动态绑定则根据实际引用的对象决定
3,在java中,private static 和fianl 方法都是静态绑定的,
4,多态是通过动态绑定实现的
红黑树
红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树,
平衡二叉树的左右子树高度差不能超过1,每次进行插入删除时,几乎都需要通过旋转操作保持平衡
这就导致了性能大打折扣:
红黑树通过牺牲一定的平衡性,减少了旋转操作,提高了性能,插入时的不平衡,不超过两次旋转就可以解决,删除时的不平衡,不超过三次旋转就能解决,保证最坏的情况下,也能在o(log2N)时间内完成查找操作
特点: 根节点时黑色,所有的叶子节点都是nul节点且为黑色,同一路径,不存在联系的红色节点
每个节点到叶子节点的所有路径,都包含相同数目的黑色节点(相同的黑色高度)
java中,TreeMap,TreeSet,HashMap都用了红黑树做为底层数据结构,当冲突的链表长度超过8时,自动转换为红黑树
class RedBlackTreeNode {
public int val;
public RedBlackTreeNode left;
public RedBlackTreeNode right;
// 记录节点颜色的color属性,暂定true表示红色
public boolean color;
// 为了方便迭代插入,所需的parent属性
public RedBlackTreeNode parent;
// 一些构造函数,根据实际需求构建
public RedBlackTreeNode() {
}
}
当红黑规则不满足时,需要对节点进行变色或者旋转操作
红黑树的左旋 :
红黑树的右旋:
红黑树新增节点的规则:
新插入的节点默认为红色因为插入黑色节点会影响黑色高度,对红黑树的影响更大
右子树的黑色高度降低,因此需要右旋,以恢复右子树的黑色高度
一切的操作都是为了保持红黑树的特点,保持红黑树的性质