TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?

根据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()方法与集合中的元素进行比较。

posted @ 2020-12-15 01:03  咔啡  阅读(167)  评论(0编辑  收藏  举报