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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聖手`书生 中级黑马   /  2013-4-24 13:17  /  1303 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 聖手`书生 于 2013-4-25 23:09 编辑
  1. class TreeSetDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. TreeSet ts = new TreeSet();

  6. ts.add(new Student("lisi02",22));
  7. ts.add(new Student("lisi007",20));
  8. ts.add(new Student("lisi09",19));
  9. ts.add(new Student("lisi08",19));
  10. //ts.add(new Student("lisi007",20));
  11. //ts.add(new Student("lisi01",40));

  12. Iterator it = ts.iterator();
  13. while(it.hasNext())
  14. {
  15. Student stu = (Student)it.next();
  16. System.out.println(stu.getName()+"..."+stu.getAge());
  17. }
  18. }
  19. }


  20. class Student implements Comparable//该接口强制让学生具备比较性。
  21. {
  22. private String name;
  23. private int age;

  24. Student(String name,int age)
  25. {
  26. this.name = name;
  27. this.age = age;
  28. }

  29. public int compareTo(Object obj)
  30. {

  31. //return 0;

  32. if(!(obj instanceof Student))
  33. throw new RuntimeException("不是学生对象");
  34. Student s = (Student)obj;

  35. System.out.println(this.name+"....compareto....."+s.name);
  36. if(this.age>s.age)
  37. return 1;
  38. if(this.age==s.age)
  39. {
  40. return this.name.compareTo(s.name);
  41. }
  42. return -1;
  43. /**/
  44. }

  45. public String getName()
  46. {
  47. return name;

  48. }
  49. public int getAge()
  50. {
  51. return age;
  52. }
  53. }
复制代码
老师讲解的时候,明明打印的结果没有lisi02和lisi02 对比,但是我自己运行时候,就会产生这情况,如图中红色框框结果。确实不解,需求合理解释。

QQ图片20130424131639.jpg (24.22 KB, 下载次数: 11)

QQ图片20130424131639.jpg

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

6 个回复

倒序浏览
貌似只要是第一个就会和自身比较吧....
因为里面除了和自身比之外..
就没有可比对象了..
睡了...
上海书生是你吗..
回复 使用道具 举报
本帖最后由 刘渝灵 于 2013-4-24 14:35 编辑

之前我发过和你同样问题的帖子,可以搜索一下。这个应该是jdk1.7后安全性方面的提升。之所以在第一次存入元素的时候也调用compareTo方法,是为了确保第一个元素也具备比较性,更严谨。现举例说明(只添加一个元素):
                TreeSet<Student> ts = new TreeSet<Student>();
                Student s1 = new Student();//注意,此Student类未实现Comparable接口
                ts.add(s1);//在1.6可以正常编译并运行,但在1.7下报:Exception in thread "main" java.lang.ClassCastException: question.Student cannot be cast to java.lang.Comparable
这样也是符合了jdk更新的3大原则:更简洁,更高效,更安全

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
刘胜寒 发表于 2013-4-24 13:35
貌似只要是第一个就会和自身比较吧....
因为里面除了和自身比之外..
就没有可比对象了..

:lol是俺
回复 使用道具 举报
不知道黑马的老师,能不能帮忙解答下我这个疑虑,谢谢了。
回复 使用道具 举报
本帖最后由 breeze 于 2013-4-24 21:04 编辑

这个是jdk1.7才有的, 在jdk1.5和jdk1.6中第一次向集合添加元素是先判断集合是否为null(isEmpty()方法返回true), 如果为null是不会进行比较的, 直接添加, 在jdk1.7中是会判断集合是否为null, 如果是就会将自己与自己比一次, 具体实现细节, 参考源代码
回复 使用道具 举报
我说呢,我怎么用jdk1.7的 第一次存入元素,然后输出的时候报出异常,而看 毕老师视频里面的都没事,原来是版本更新导致的啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马