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,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边