黑马程序员技术交流社区

标题: 还是有关TreeSet的小问题! [打印本页]

作者: 孔斌    时间: 2013-2-9 16:17
标题: 还是有关TreeSet的小问题!
如果TreeSet集合中存放了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法?

作者: 刘军亭    时间: 2013-2-9 17:04
如果子类复写类父类的比较方法,那用的肯定是子类的,如果没有复写那只能找父类的比较方法。
作者: 李大强    时间: 2013-2-11 18:22

从这个问题就可以看出你还没有完全明白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));
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2