zoukankan      html  css  js  c++  java
  • 51. TreeSet

    集合分类:
    -------------------| Collection 单列集合的根接口   
    ---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复
    -----------| ArrayList ArrayList底层维护的是一个Object类型的数组,特点是:查询快,增删慢
    使用场景:如果目前的数据查询多,增删少,那么就使用ArrayList存储数据
    注意:使用ArrayList无参构造方法时,Object默认的长度时10,不够的话自动增长0.5倍
    -----------| LinkedList LinkedList底层使用了链表数据结构实现的。特点是:查询慢,增删快
    使用场景:数据查询少,增删多的时候,用LinkedList存储

    ---------------| Set 如果实现了Set接口的集合类,具备的特点是:无序,不可重复
    注意:Set接口没有get()方法,迭代器才是通用遍历集合的方法,所以我们最好使用迭代器遍历
    -----------| HashSet

    HashSet的实现原理:
        往HashSet添加元素的时候,HashSet会自动先调用元素的hashCode方法得到元素的哈希表,然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置
        
        情况一:如果算出元素的存储位置目前还没有元素,那么该元素可以直接存储到该位置
        
        情况二:如果算出元素的存储位置已经存在其他元素,那么会自动调用equals方法再进行比较一次如果equals返回ture那么就视为重复元素,不可添加,如果返回false,那么就可以添加
        
        注意:hashCode和equals方法,都是自动调用的,并不是我们手动调用(注意List接口和Set实现原理不同之处)
        
    -----------| ThreeSet

    ThreeSet注意事项:
        1.ThreeSet在添加元素的时候,如果数据有自然排序规则,那么就按照元素的自然顺序的特性进行排序存储
        2.ThreeSet在添加元素的时候,如果数据不具备自然排序规则,那么该元素所属类必须实现Comparable接口,把元素的比较规则写在compareTo方法上
        3.ThreeSet在添加元素的时候,如果元素本身不具备自然数据特性,而元素也没有实现Comparable接口,那么必须要在创建ThreeSet的时候传入一个比较器
        4.如果比较元素的时候调用compareTo返回的是0,那么该元素就被视为重复元素,不可添加(注意:跟hashcode和equals无关)

     

    自然特性:

        例如 数字 字母等,因为它们都实现了Comparable接口,不需要我们再自己定义排序规则了

    字符串比较规则:

        情况一:对应位置有不同字符出现,那么就比较的就是对应位置的字符

        情况二:对应位置有相同的字符出现,那么比较的是字符的长度


    比较器定义规则:
        自定义一个类,实现Comparable接口,把比较规则写在compareTo方法中

        注意:ThreeSet是在排好序再进行存储的,并不是在输出的时候再排序输出的

    推荐使用:比较器,这样提高了代码的重用性

    ThreeSet的存储原理:
        底层是使用红黑数(二叉树)数据结构实现的     储存规则:左小右大

    首先第一个是老钟,因为没有比较的对象,所以老钟排在最顶端

    第二是老陆先跟老钟比,比老钟小,所以排在老钟的左边

    第三是老汤先跟老钟比,比老钟大,所以排在老钟的右边

    第二是老黎先跟老钟比,比老钟大,所以排在老钟的右边,再跟老汤比比老汤大所以在老汤的右边

    最后的结果是:老陆 老钟  老汤  老黎

    注意:如果三个数据还没有构成二叉树数据结构,那么就会自动调增为二叉树数据结构

    也就是:

      先添加老陆后添加老钟那么老钟在老陆右边

      再添加老汤,老汤比老陆和老钟都大,再老钟右边

      这时就是没有构成二叉树数据结构,那么它会自动调增为

      老钟在最上面,老陆在左边,老汤在右边

    不具备自然规则的实例:

    class People {
        int id;
        String name;
        
        public People(int id , String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public String toString() {
            
            return "{ 身份证"+this.id+" 姓名:"+this.name+" }";
        }
    }
    
    class PeopleComparator implements Comparator{
    
        @Override
        public int compare(Object o1, Object o2) {
            People p1 = (People)o1;
            People p2 = (People)o2;
            return p1.id-p2.id;
        }
    
        
        
    }
    public class Demo2 {
        public static void main(String[] args) {
            PeopleComparator peocom = new  PeopleComparator();
            TreeSet set = new TreeSet(peocom);
            set.add(new People(1003,"狗蛋"));
            set.add(new People(1001,"狗娃"));
            set.add(new People(1002,"老李"));
            //添加一个身份证一样的,姓名不一样的人
            set.add(new People(1001,"老八"));
            //使用迭代器遍历
            Iterator it =  set.iterator();
            while(it.hasNext()) {
                System.out.println(it.next());
            }
        }
    
    }

    具备规则的实例:

    public class Demo2 {
        public static void main(String[] args) {    
            TreeSet set = new TreeSet();
            set.add(10);
            set.add(5);
            set.add(9);
            TreeSet set1 = new TreeSet();
            set1.add("b");
            set1.add("c");
            set1.add("a");
            //使用迭代器遍历
            Iterator it =  set.iterator();
            while(it.hasNext()) {
                System.out.print(it.next()+",");
            }
            System.out.println(" ");
            Iterator it1 =  set1.iterator();
            while(it1.hasNext()) {
                System.out.print(it1.next());
            }
        }
    }

  • 相关阅读:
    Python3 从零单排10_xml&configparser
    Python3 从零单排9_json&pickle&shelve
    Python3 从零单排7_模块&os&sys
    Python3 从零单排6_装饰器&生成器&迭代器
    Python3 从零单排5_内置函数
    python3 从零单排4_函数进阶
    Python3 从零单排2_文件读写&集合
    查看innodb表空间
    如何从innodb的数据字典里恢复表结构
    innodb double write buffer
  • 原文地址:https://www.cnblogs.com/zjdbk/p/8995197.html
Copyright © 2011-2022 走看看