Set和List接口有同一个父类接口Collection

1.Set

作为TreeSet父类接口, Set有如下几个特点.
1.可以去除重复
2.存取顺序不一致
3.没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素

2.TreeSet的特点

1.不包含重复元素的集合
2.没有带索引的方法
3.可以将元素按照规则进行排序自然排序以及比较器排序

//定义一个TreeSet的方法
TreeSet<Student> set = new TreeSet<>();

3.自然排序

Integer和String类型等Java自带的类基本上都自带了自然排序, 所以 一般自己定义的类才需要自己重写自然排序的规则
首先类需要实现(implements)Comparable接口,然后重写 public int compareTo(E) 方法
以学生类举例,这个排序方法实现的是按学生年龄排序,如果学生年龄相同则按学生姓名的首字母排序

    @Override
    public int compareTo(Student o) {
        int result = this.age - o.age;
        result = result == 0 ? this.name.compareTo(o.name) : result;
        return result;
    }

4.比较器排序

想使用比较器排序Compartor, 定义TreeSet的时候不能使用空参构造方法了, 需要使用带参构造方法并接受Compartor(这是一个接口)的实现类对象, 所以可以用匿名内部类或者Lamdba表达式重写里面的compare(T o1, To2)方法

//匿名内部类
        TreeSet<String> tree = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int res = o1.length() - o2.length();
                res = res == 0 ? o1.compareTo(o2) : res;
                return res;
            }
        });
//Lamdba表达式
        TreeSet<String> tree = new TreeSet<>((String o1, String o2) -> {
            int res = o1.length() - o2.length();
            res = res == 0 ? o1.compareTo(o2) : res;
            return res;
        });

5.两种比较方式的选择

自然排序:自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序


两种方式中,关于返回值的规则:
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边