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

    Java Program!
  • 相关阅读:
    缓冲式I/O
    事件轮询接口
    博弈游戏
    多任务I/O之poll函数
    好的link
    做纹理处理的。。。
    快毕业了!
    语音处理的资料
    google图像搜索原理
    install opencv in centos
  • 原文地址:https://www.cnblogs.com/programb/p/14068533.html
Copyright © 2020-2023  润新知