TreeSet的实现
TreeSet底层实际是用TreeMap实现的,内部维持了一个简化版的TreeMap,通过key来存储Set的元素。 TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
TreeSet构造器源码:
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet特点
与TreeMap相同,TreeSet是无序、不可重复的、会对存储的元素进行排序。
使用TreeSet要点:
- 由于是二叉树,需要对元素做内部排序。 如果要放入TreeSet中的类没有实现Comparable接口,则会抛出异常:java.lang.ClassCastException。
- TreeSet中不能放入null元素。
实例:
class Student implements Comparable<Student> {
private Integer id;
private String name;
private Integer age;
@Override
public int compareTo(Student o) { // 负数:小于 整数:大于 零:等于
if (this.id > o.id) {
return 1;
} else if (this.id < o.id) {
return -1;
} else {
return 0;
}
}
public Student(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
public class Test {
public static void main(String args[]) {
Set<Student> hashSet = new TreeSet<Student>();
hashSet.add(new Student(3,"小猪",25));
hashSet.add(new Student(4,"小鸡",25));
hashSet.add(new Student(1,"小猫",18));
hashSet.add(new Student(2,"小狗",20));
hashSet.add(new Student(2,"小狗",21));
System.out.println(hashSet);
}
}
------------------------------------------------
输出结果为:
[Student [id=1, name=小猫, age=18], Student [id=2, name=小狗, age=20], Student [id=3, name=小猪, age=25], Student [id=4, name=小鸡, age=25]]