/*
往TreeSet集合中存储自定义对象学生
往按照学生的年龄进行排序
*/
import java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet();
ts.add(new Student("lisi",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));
Iterator it=ts.iterator();
while(it.hasNext())
{
Student stu=(Student)it.next();
System.out.println(stu.getName()+"和"+stu.getAge());
}
}
}
class Student implements Comparable//该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Object obj)//这个方法在调用add方法时候强制默认自动调用
{
if(!(obj instanceof Student))//比较的前提:两个对象的类型相同
throw new RuntimeException("不是学生对象");
Student s=(Student)obj;/*当采用compareTo(Object obj)方法比较对象时,都需要将被比较对象obj强制类型转换成相同类型,因为只有相同类的两个实例才能比较大小*/
System.out.println(this.name+"比较"+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);//String类已经实现CompareTo
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}

想问一下,整个compareTo方法没有经过调用,是在add的时候启动的吗?那传进去的值怎么确定啊?compareTo里面的引用变量this和s分别是谁啊?我看了好久,看不出个所以然
------解决思路----------------------
1、是的compareTo是在add的时候调用,具体是;
TreeSet其实使用TreeMap实现,而TreeMap在put元素的时候,如果TreeMap本身没有比较器就会用插入元素(即KEY值)自身的比较器进行比较,并插入到合适的位置
2、compareTo里面的this就是插入的元素本身,而compareTo的参数就是在add的时候和集合里面的元素遍历和插入的元素进行比较,所以遍历集合已存在的元素的时候把遍历项传入compareTo方法来确定新插入元素的排序位置