A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔斌 中级黑马   /  2013-2-9 16:17  /  1653 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果TreeSet集合中存放了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法?

2 个回复

倒序浏览
如果子类复写类父类的比较方法,那用的肯定是子类的,如果没有复写那只能找父类的比较方法。
回复 使用道具 举报

从这个问题就可以看出你还没有完全明白compareTo(Object  obj)的具体调用过程!

首先,由于TreeSet 集合是一个有序的集合,所以向里面添加的元素必须具有比较性或定义集合时就自定义一个比较器才可以。

其次,当向集合中第一次添加元素时,由于集合中根本就没有元素,所以也就用不着比较,古无论谁的compareTo(Object  obj)方法都不会被调用。

再次,当集合中有元素时,此时再添加元素,就会拿着当前所添加对象的compareTo(Object  obj)与集合中已经存在的对象进行比较。

再次需要特别强调的是,由于compareTo()方法返回值的正负将直接决定排列的顺序,
所以这里到底“谁调用谁的compareTo(Object  obj)方法并把谁传递进来当参数”就显得特别重要了!

事实上,这里的顺序是“正要被添加到集合的对象将调用自己的compareTo(Object  obj)方法,传进来的参数为集合中已经存在的
某个对象”!

综上所述也就没有什么“子父”之分了,关键是“添加的先后次序”的原因了!

如果不相信,可以看看下面的程序:
import java.util.Iterator;
import java.util.TreeSet;


public class Test
{

        /**
         * @param args
         */
        public static void main(String[] args)
        {
               
                TreeSet ts = new TreeSet();
                ts.add(new Father("f1",23));
                ts.add(new Father("f2",16));
               
               
                ts.add(new Son("s1",34));
                ts.add(new Son("s2",53));
       
               

                Iterator it = ts.iterator();
                while(it.hasNext())
                {
                        Father father = (Father)it.next();
                        System.out.println(father.getAge());
                }
        }

}

class Father implements Comparable
{
        int age=0;
        String name="";
       
        Father(String name,int age)
        {
                this.age=age;
                this.name=name;
        }
       
        public int getAge()
        {
                return age;
        }
       
        public int compareTo(Object obj)
        {
                Father f=(Father)obj;
                System.out.println("父类构造方法"+name);
               
                return new Integer(this.age).compareTo(new Integer(f.age));
        }
}

class Son extends Father
{

        Son(String name,int age)
        {
                super(name,age);
               
        }
       
        public int compareTo(Object obj)
        {
                Father f=(Father)obj;
                System.out.println("子类构造方法"+this.name);
               
                return new Integer(this.age).compareTo(new Integer(f.age));
        }
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马