zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    fastapi+vue搭建免费代理IP网站部署至heroku
    如何选择免费代理ip,需要注意哪些指标值和基本参数
    如何部署MongoDB并开启远程访问Docker版
    Linux设置Frps Frpc服务开启启动
    Docker搭建VS Code Server ,设置访问密码随时随地写代码
    薅羊毛须及时 多平台微信线报提醒脚本
    python+selenium实现百度关键词搜索自动化操作
    用python selenium 单窗口单IP刷网站流量脚本
    杂记 内容会在留言中补充
    c#杂记
  • 原文地址:https://www.cnblogs.com/programb/p/14068533.html
Copyright © 2011-2022 走看看