一,红黑树:为了解决在二叉查找树(BST)中不断加入新结点而导致不平衡问题所诞生的新树
红黑结点:
包含五个信息:父结点地址,值,左子结点地址,右子结点地址,颜色
红黑规则:
1)每一个结点是红色或者黑色
2)根节点必须是黑色的
3)如果一个结点没有子结点或者父结点,那么该结点相应的指针属性值为Nil,这些
Nil视为叶结点,每个叶结点(Nil)是黑色的
4)如果某一个结点是红色,那么它的子结点必须是黑色(不能出现两个结点相连的情 况)
5)对每一个结点,从该结点到其所有后代叶结点(Nil)的简单路径(不回头)上均包含 相同的黑色结点
刚开始添加红黑结点默认为红色
添加结点的规则;
1.若添加为根节点,将颜色直接变为黑色
2.若添加为非根节点:1)父节点为黑色,直接添加 2)父节点为红色,则观察叔叔结点,
若叔叔结点为红色: 将父节点和叔叔结点设置为黑色,将祖父 结点设置为红色,若祖父结点为根节点,则将其在此变为黑色。
若叔叔结点为黑色:将父节点设置为黑色,将祖父结点设置为 红色,以祖父结点为支点进行旋转
二,HashSet
1.底层原理:HashSet底层是哈希表结构
哈希值:通过对象的地址算出来的一个int类型的值,成为哈希值,每一个对象都有。
如果获取哈希值?
在object类当中有一个hashCode()方法,通过这个方法可以获取哈希值。
注意:同一个对象的哈希值是一样的。不同对象的哈希值实不一样的。
一般自己写一个类可以复写HashCode()方法,这样可以通过自己的属性来计算哈希值。
2. 在JDK7中,哈希表是有数组加链表的结构。当往哈希表中添加元素时,先做如下几件事:
1)计算哈希值,根据哈希值来确定在数组的索引位置
2)判断这个位置是否有元素,如果没有,直接薅,如果有把添加的元素和集合中已经有的元素用equals进行比较
3) 如果哈希值和equals比较都相同,认为元素重复,不存进去
4) 如果哈希值相同,equals比较的不同,就以链表的形式进行存储
3,在JDK8中,HashSet底层是数组+链表+红黑树
如果同一个哈希值位置的元素超过8个,则将链表改为红黑树
4,复写hashCode和equals方法,可以将HsahSet包装元素唯一