黑马程序员技术交流社区

标题: TreeSet集合元素自然排序问题 [打印本页]

作者: 聖手`书生    时间: 2013-4-24 13:17
标题: TreeSet集合元素自然排序问题
本帖最后由 聖手`书生 于 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, 下载次数: 14)

QQ图片20130424131639.jpg

作者: 刘胜寒    时间: 2013-4-24 13:35
貌似只要是第一个就会和自身比较吧....
因为里面除了和自身比之外..
就没有可比对象了..
睡了...
上海书生是你吗..
作者: 刘渝灵    时间: 2013-4-24 14:34
本帖最后由 刘渝灵 于 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大原则:更简洁,更高效,更安全

作者: 聖手`书生    时间: 2013-4-24 15:35
刘胜寒 发表于 2013-4-24 13:35
貌似只要是第一个就会和自身比较吧....
因为里面除了和自身比之外..
就没有可比对象了..

:lol是俺
作者: 聖手`书生    时间: 2013-4-24 15:37
不知道黑马的老师,能不能帮忙解答下我这个疑虑,谢谢了。
作者: breeze    时间: 2013-4-24 21:02
本帖最后由 breeze 于 2013-4-24 21:04 编辑

这个是jdk1.7才有的, 在jdk1.5和jdk1.6中第一次向集合添加元素是先判断集合是否为null(isEmpty()方法返回true), 如果为null是不会进行比较的, 直接添加, 在jdk1.7中是会判断集合是否为null, 如果是就会将自己与自己比一次, 具体实现细节, 参考源代码
作者: 郭韶路    时间: 2013-4-26 09:55
我说呢,我怎么用jdk1.7的 第一次存入元素,然后输出的时候报出异常,而看 毕老师视频里面的都没事,原来是版本更新导致的啊。




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