TreeSet集合石用来对象元素进行排序的,同样也具有保持元素唯一性的特征(通过实现Comparable接口)。
import java.io.Serializable;
public class Student implements Serializable, Comparable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
"}\n";
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Student)){
throw new ClassCastException("object to cast student error !");
}
return this.age - ((Student)o).age;
}
}
import java.util.TreeSet;
public class Main {
public static void main(String []args){
TreeSet<Student> hs = new TreeSet<Student>();
for(int i = 0; i< 10; i++){
hs.add(new Student("AA"+i, 10));
}
System.out.println(hs);
}
}
* Exception in thread "main" java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
如果不完成Comparable 接口就会出现以上异常
总结
特点
TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
使用方式
a.自然序列(Comparable)
TreeSet类的add()方法会把存入的对象提升为Comparable类型
调用对象的ComparaTo()方法和集合的对象比较
根据Comparable()方法返回结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以定制一个Comparator
如果传入了Comparable的子类对象,那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparable接口中的Compare()方法排序
调用的对象石compare方法的第一个参数,集合中的对象是compare方法的第二个参数
c.两种方法的区别
TreeSet构造函数不传任何参数,按默认类中comparable()的顺序(没有就会报错classCastException)
TreeSet如果传入Comparator ,就优先按照Compartor