• [集合Set]HashSet、LinkedHashSet TreeSet


    Set

    Set是不包含重复元素的集合。更正式地,集合不包含一对元素e1e2,使得e1.equals(e2),并且最多一个空元素

      无索引,不可以重复,无序(存取不一致)

    Set接口除了继承自Collection接口的所有构造函数以及add,equalshashCode方法外,增加了其他方法


    HashSet

    此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证; 特别是,它不能保证此顺序在一段时间内保持不变。 这个类允许使用null元素。

     HashSet 保证存储数据唯一的方法:

    • HashCode方法给每个元素计算数值并进行比较
    • 当 HashCode数值一样时,会调用 equals 方法进行比较


    LinkedHashSet

    底层是链表实现的,是 Set 集合中唯一一个能保证存取顺序一致的集合对象

    因为是 HashSet 的子类,所以也能保证元素唯一,与 HashSet 原理一样


    TreeSet(重要)

    TreeSet 集合是用来对 对象进行排序的,可以指定一个顺序,也可以保证元素的唯一

    TreeSet 存储的方法是采用了Tree 二叉树。保证元素唯一的原理是其中用到了 CompareTo()  方法进行比较,小的返回负数,存储在二叉树的左边,大的返回整数,存储在右边,相等返回0,不存储。

     所以当compareTo 方法返回0的时候集合中只有一个元素

               返回正数的时候集合会怎么存怎么取,顺序存取

               返回负数的时候集合会倒序存储

    更多TreeSet集合相关知识见这篇博客 : 

    JavaSE基础 TreeSet集合(红黑树数据结构)

    代码示例

    学生类

    package com.gaoyang.set;
    
    public class Student {
        private String name;
        private int chinese;
        private int math;
        private int english;
        private int sum;
        
        public Student() {
            super();
            // TODO Auto-generated constructor stub
        }
        
        public Student(String name, int chinese, int math, int english) {
            super();
            this.name = name;
            this.chinese = chinese;
            this.math = math;
            this.english = english;
            this.sum = this.chinese + this.math + this.english ; 
        }
        
        public int getSum() {
            return sum;
        }
    
        @Override
        public String toString() {
            return "Student " + name  +  " : " + "chinese=" + chinese + ", math=" + math + ", english=" 
                    + english + ", sum= "+ sum ;
        }
    
    }
    

     操作代码

    package com.gaoyang.set;
    
    import java.util.Comparator;
    import java.util.Scanner;
    import java.util.TreeSet;
    
    public class test_TreeSet {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入学生姓名成绩,格式为:姓名,语文成绩,数学成绩,英语成绩");
            TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
    
                @Override
                public int compare(Student s1, Student s2) {
                    int num = s2.getSum() - s1.getSum();
                    return num == 0 ? 1 : num;
                }
            }); 
            
            while(ts.size() < 5) {
                String line = sc.nextLine();
                String[] arr = line.split(",");
                int chinese = Integer.parseInt(arr[1]);
                int  math = Integer.parseInt(arr[2]);
                int english = Integer.parseInt(arr[3]);
                //存入集合中
                ts.add(new Student(arr[0],chinese, math, english));
                
            }
        
            System.out.println("排序后的学生成绩");
            for (Student student : ts) {
                System.out.println(student);
            }
        }
    }
    
  • 相关阅读:
    day08,文件操作。
    day07,基础数据部分的补充
    day06,1,小数据池,常量池。2,编码。
    day05,字典(dic)
    day04,1列表,2列表的增删改查,3列表的嵌套,4元祖,
    day03:python基础数据类型操作(索引,切片,迭代)
    day02_while循环 ,运算符,格式化输出
    变量的命名规则
    Day-23 基础模块4 模块导入_包
    Day-22 基础模块3 正则表达式_re模块
  • 原文地址:https://www.cnblogs.com/gaoyang666/p/11199779.html
Copyright © 2020-2023  润新知