博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题: TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!...
阅读量:5138 次
发布时间:2019-06-13

本文共 2520 字,大约阅读时间需要 8 分钟。

 问题:TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

我个人测试的结果是:当前的add方法 放入父类的对象,就会报错。    如果 放入子类的对象,则各自调用各自的compareTo()方法进行排序。

 引入问题: 如果 子类没有重写 compareTo()方法,放入子类和父类的对象的顺序 可以随便放,但是遍历的结果子类对象只能加入一个。这又是为什么?????求解?

看代码:

 

package 测试比较父类子类conpateTo;public class Parent  implements Comparable  {	private String name;	private int age;		public int getAge(){		return age;	}	public Parent(){		System.err.println("Parent无参构造器"+name+":"+age);	};	public Parent(String name,int age){		this.name=name;		this.age=age;		System.err.println("Parent双参构造器"+name+":"+age);	}	//父类年龄升序排列	@Override	public int compareTo(Object o) {		Parent obj = (Parent)o;		return this.age-obj.getAge();	}		public String toString(){		return name+":"+age;	}	}

 

  

package 测试比较父类子类conpateTo;public class Children extends Parent {	private String name;	private int age;		public Children(String name, int age) {		super();		this.name = name;		this.age = age;	}	@Override 	//子类年龄降序排列	public int compareTo(Object o){		Children c=(Children)o;		return c.age-this.age;	}	public String toString(){		return name+":"+age;	}}

  

测试1:

先放入父类任意一个对象,报错  ClassCastException
public class Test {	public static void main(String[] args) {		TreeSet
t=new TreeSet(); Parent p=new Parent("Parent1", 45); Parent p1=new Parent("Parent2", 47); Parent p2=new Parent("Parent3", 24); Parent p4=new Parent("Parent4", 22); Children c1=new Children("Jame1",12); Children c2=new Children("Jame2",23); Children c3=new Children("Jame3",46); System.out.println("TreeSet遍历-------"); //先放入父类任意一个对象,报错 ClassCastException t.add(p); t.add(c2); t.add(c1); t.add(p1); t.add(p4); t.add(c3); t.add(p2); Iterator
iterator=t.iterator(); while(iterator.hasNext()){ System.err.println(iterator.next()); } }}

  

测试2:

//先放入子类的对象		t.add(c2);		t.add(c1);		t.add(p1);		t.add(p4);		t.add(c3);		t.add(p);		t.add(p2);

 输出结果:

Parent双参构造器Parent1:45Parent双参构造器Parent2:47Parent双参构造器Parent3:24Parent双参构造器Parent4:22Parent无参构造器null:0Parent无参构造器null:0Parent无参构造器null:0TreeSet遍历-------Jame3:46Jame2:23Jame1:12Parent4:22Parent3:24Parent1:45Parent2:47

 

测试3:  子类没有重写 compareTo()方法

         t.add(p4);		t.add(c3);  //我先加入,只有我了		t.add(c2);		t.add(p2);		t.add(p1);		t.add(p);		t.add(c1);

  

Parent双参构造器Parent1:45Parent双参构造器Parent2:47Parent双参构造器Parent3:24Parent双参构造器Parent4:22Parent无参构造器null:0Parent无参构造器null:0Parent无参构造器null:0TreeSet遍历-------Jame3:46Parent4:22Parent3:24Parent1:45Parent2:47

  

 

转载于:https://www.cnblogs.com/gshao/p/10195934.html

你可能感兴趣的文章
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
距离公式汇总以及Python实现
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
php match_model的简单使用
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
STM32单片机使用注意事项
查看>>
移动开发平台-应用之星app制作教程
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
如何在maven工程中加载oracle驱动
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>