红黑树和HashSet

一,红黑树:为了解决在二叉查找树(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包装元素唯一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值