黑马程序员技术交流社区
标题:
一个小问题,高手请帮忙
[打印本页]
作者:
李鑫
时间:
2012-6-13 12:20
标题:
一个小问题,高手请帮忙
TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常了?
作者:
赵兵锋
时间:
2012-6-13 12:34
class T implements Comparable<T>{
public int x=10;
public T(){}
public T(int t){
x = t;
}
@Override
public int compareTo(T o) {
System.out.println("T"+x);
return 0;
}
}
class TT extends T{
public TT(int t){
x = t;
}
@Override
public int compareTo(T o) {
System.out.println("TT"+x);
return 0;
}
}
public class Main{
public static void main(String[] as) {
TreeSet<T> set = new TreeSet<T>();
set.add(new T(1));
set.add(new TT(11));
set.add(new T(2));
set.add(new T(3));
set.add(new TT(20));
set.comparator();
}
}
/*输出:
TT11
T2
T3
TT20
我的理解是:按照添加的顺序,第一个和第二个比较,用后者的compareTO方法,再第二个和第三个比较,再用后者的compareTo方法。*/
复制代码
作者:
云惟桉
时间:
2012-6-13 17:11
本帖最后由 云惟桉 于 2012-6-13 17:17 编辑
比较是一个相对的概念,但是在程序中处理的时候,是按照操作句柄来的。
比如说add(A1),那么这里A1就是句柄。因为对add方法来说,直接产生联系的可见对象是A1,A2对于add是直接不可见的。
A1.compareTo(A2),进行对应操作的时候会使用句柄A1的方法来处理。
所以在TreeSet中,如果需要add(A1),那么使用的就是A1的compareTo。因此每次添加的时候调用的都是“被加入”对象的compareTo。
另外从性能方面考虑,如果TreeSet中存放了继承层次更多的对象(比如5层继承)
那么当添加时,举一个例子:
TreeSet已有: A1 B1 C2 D4 E5
添加: A2
那么分别使用A1 B1 C2 D4 E5的compareTo,但是这写对象的存放位置(地址)并不一定是连续的,那搜索这些对象的时间就成了开销。
如果使用的是A2的compareTo,那么每次就需要该A2的compareTo,省去了搜索的时间开销。
当然一个集合中数据量大的时候,才会有所体现。并且这部分只是个人理解,还望指正。
希望能和楼主交流~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2