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方法正数排前面 负数排后面 一样的话返回0int value = this.name.compareTo(o.name);//名字如果一样 返回值是0if(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}]}
