黑马程序员技术交流社区

标题: 往TreeSet添加元素时,结果怎么和老毕视频中不一样? [打印本页]

作者: 刘渝灵    时间: 2013-4-7 11:24
标题: 往TreeSet添加元素时,结果怎么和老毕视频中不一样?
本帖最后由 刘渝灵 于 2013-4-8 10:12 编辑

往TreeSet集合中添加元素时,添加第一个元素会调用compareTo方法跟自己比吗?怎么和老毕视频不一样
file:///C:/Users/zdmin/AppData/Local/youdao/ynote/images/1D4538E7178B437284830CE521FD2D4E/61B59CCAD5DD4F73B899C6CDF6C07485.jpg
file:///C:/Users/zdmin/AppData/Local/youdao/ynote/images/1D4538E7178B437284830CE521FD2D4E/61B59CCAD5DD4F73B899C6CDF6C07485.jpg

1.jpg (27.77 KB, 下载次数: 28)

1.jpg

作者: 黑马李超    时间: 2013-4-7 13:28
我运行的时候也是一样,第一个元素会和自己先比较一下。
我的理解是只要元素存入TreeSet中,就会调用compareTo方法,如果TreeSet是空的话,就自己和自己比较一下。
作者: 随便    时间: 2013-4-7 14:53
本帖最后由 邓宫财 于 2013-4-7 15:00 编辑
  1. public class TreeSetTest {

  2.         public static void main(String[] args) {
  3.                 TreeSet<Student> ts = new TreeSet<Student>();
  4.                 ts.add(new Student("a2", 32));
  5.                 ts.add(new Student("a1", 11));
  6.                 ts.add(new Student("a3", 31));
  7.                 System.out.println(ts);
  8.         }
  9.         
  10.         static class Student implements Comparable{
  11.                 private String name = "";
  12.                 private int age = 0;
  13.                 public Student(String name,int age) {
  14.                         this.name = name;
  15.                         this.age = age;
  16.                 }
  17.                
  18.                 public String getName() {
  19.                         return name;
  20.                 }

  21.                 public void setName(String name) {
  22.                         this.name = name;
  23.                 }

  24.                 public int getAge() {
  25.                         return age;
  26.                 }

  27.                 public void setAge(int age) {
  28.                         this.age = age;
  29.                 }

  30.                 @Override
  31.                 public int compareTo(Object o) {
  32.                         Student s = null;
  33.                         if(o instanceof Student){
  34.                                 s = (Student)o;
  35.                         }
  36.                         //打印信息
  37.                         System.out.println(this.name + "----" + s.getName());
  38.                         //大于
  39.                         if(this.age > s.getAge()){
  40.                                 return 1;
  41.                         }else if(this.age < s.getAge()){//小于
  42.                                 return -1;
  43.                         }
  44.                         return 0;
  45.                 }
  46.         }

  47. }
复制代码
我运行的时候,没有出现第一次会跟自己相比较。
不知道你们的代码是怎么实现的
  1. public boolean add(E e)将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。更确切地讲,如果该 set 不包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则将指定元素 e 添加到此 set 中。如果此 set 已经包含这样的元素,则该调用不改变此 set 并返回 false。
复制代码
按照文档说的,如果是相同元素就不能被添加进去。

如果你们的代码第一次是跟自己比较的话a1 compareto a1,说明该集合已经存在一个这样的元素 a1,按理来说是添加不进去的。

作者: 柳 德 彬    时间: 2013-4-7 23:40
TreeSet底层实际是由TreeMap来实现的,在添加第一个元素的时候不会调用compareTo()方法,如果是首次添加,就会直接加进去,第二次添加的时候,如果已经存在就会替换掉原来的那个值。在这里,你是添加的对象,是没法进行比较的,只能自己提供比较器。
作者: 谢波    时间: 2013-4-8 09:45
出现第一次和自己比的情况呢
应该是用的jdk7.0
换成jdk6.0就不会出现这种情况了
个人认为,这种功能的升级是出于安全性考虑
当然在思维上也更加严谨,让所有要存到TreeSet中的对象,都必须具有可比性
作者: 刘渝灵    时间: 2013-4-8 10:12
谢波 发表于 2013-4-8 09:45
出现第一次和自己比的情况呢
应该是用的jdk7.0
换成jdk6.0就不会出现这种情况了

谢谢,明了了。
作者: 陈丽莉    时间: 2013-4-8 10:15
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~




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