TreeSet——>底层是TreeMap 二叉树
有序 无重复
1.java.util包
2.创建对象
无参数构造方法
带(Collection<? extends E> c)参数构造方法
3.常用方法
add(E e); iterator(); remove(E e); size();
…
没有修改方法
4.无重复的原则
TreeSet集合按照字母的自然顺序排列(UniCode编码)
由此联想到 compareTo方法
但是我们写的Person类没有 compareTo方法
所以要想把自己写的类存入TreeSet集合里 我们必须重写 compareTo方法
而compareTo方法是属于Comparable接口 那么实现了Comparable接口就必须重写compareTo方法
如果不重写 编译时没事 运行时会出现异常 ClassCastException
public class Person implements Comparable<Person>{
private String name;
private int age;
private int num;//编号 记录是第几个进来的
public Person(String name,int age,int num){
this.name = name;
this.age = age;
this.num = num;//编号 记录是第几个进来的
}
public int getNum(){
return this.num;
}
//重写toString方法 让对象打印输出时输出的是对象的属性 而不是一串hashCode码
public String toString(){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("{");
stringBuilder.append(this.name);
stringBuilder.append(",");
stringBuilder.append(this.age);
stringBuilder.append(",");
stringBuilder.append(this.num);
stringBuilder.append("}");
return new String(stringBuilder);
//StringBuilder 变为 String的方法有两个
//另一个是 stringBuilder.toString();
}
//如果想要person对象存入TreeSet集合里 必须实现Comparable接口 重写compareTo方法
public int compareTo(Person o) {
//compareTo方法正数排前面 负数排后面 一样的话返回0
int value = this.name.compareTo(o.name);
//名字如果一样 返回值是0
if(value!=0){//名字不一样的话
return value;
}
return this.age-o.age;//如果名字一样 再返回年龄比 表示的是年龄大的话就排后面
}
}
主方法:
public static void main(String[] args) {
TreeSet<String> stringSet = new TreeSet<String>();
stringSet.add("小明");
stringSet.add("小明");
stringSet.add("小明");
stringSet.add("小明");
stringSet.add("小明");
System.out.println(stringSet.size());
TreeSet<Person> personSet = new TreeSet<Person>();
personSet.add(new Person("小明",25,5));
personSet.add(new Person("小明",18,1));
personSet.add(new Person("小明",16,2));
personSet.add(new Person("小明",20,3));
personSet.add(new Person("小明",22,4));
System.out.println(personSet.size());
System.out.println(personSet);
//重写compareTo方法后
// 输出 [{小明,16,2}, {小明,18,1}, {小明,20,3}, {小明,22,4}, {小明,25,5}]
}