根据TreeSet底层的实现:TreeSet底层的实现就是红黑树,因此当程序向TreeSet中添加集合元素时,程序会多次调用该对象的compareTo()方法与TreeSet中的集合元素进行比较,直到找到该元素在红黑树中应当所在节点位置。因此该问题的答案是:当前正在添加父类对象就多次调用父类对象的compareTo()方法;当前正在添加子类对象就多次调用子类对象的compareTo()方法。
至于程序是否抛出异常,则取决于compareTo()方法的实现,如果子类在实现compareTo()方法时,试图把被比较对象转换为子类对象之后再进行比较——如果TreeSet集合中已经包括了父类对象,这就会引起ClassCastException。
示例代码如下:
class A implements Comparable
{
int age;
public A(int age)
{
this.age = age;
}
public int compareTo(Object obj)
{
System.out.println("AAAAAAAAAA");
A target = (A)obj;
return age > target.age ? 1 : age < target.age ? -1 : 0;
}
public String toString()
{
return getClass() + ",age:" + age;
}
}
class B extends A implements Comparable
{
public B(int age)
{
super(age);
}
public int compareTo(Object obj)
{
System.out.println("BBBBBBBBB");
A target = (A)obj;
return age > target.age ? 1 : age < target.age ? -1 : 0;
}
}
public class TreeSetTest2
{
public static void main(String[] args)
{
TreeSet set = new TreeSet();
set.add(new A(3));
set.add(new B(1));
set.add(new A(2));
for(Iterator it = set.iterator(); it.hasNext() ;)
{
System.out.println(it.next());
}
}
}
上面程序可以看到,输出:
AAAAAAAAAA
BBBBBBBBB
AAAAAAAAAA
AAAAAAAAAA
第一次添加A对象,所以调用A对象的compareTo()方法;第二次添加B对象,所以程序调用了B对象的compareTo()方法;第三次再次添加A对象,由于集合中已经有两个对象,因此程序两次调用了A对象的compareTo()方法与集合中的元素进行比较。