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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘渝灵 于 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, 下载次数: 19)

1.jpg

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
我运行的时候也是一样,第一个元素会和自己先比较一下。
我的理解是只要元素存入TreeSet中,就会调用compareTo方法,如果TreeSet是空的话,就自己和自己比较一下。
回复 使用道具 举报
本帖最后由 邓宫财 于 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,按理来说是添加不进去的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
TreeSet底层实际是由TreeMap来实现的,在添加第一个元素的时候不会调用compareTo()方法,如果是首次添加,就会直接加进去,第二次添加的时候,如果已经存在就会替换掉原来的那个值。在这里,你是添加的对象,是没法进行比较的,只能自己提供比较器。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
出现第一次和自己比的情况呢
应该是用的jdk7.0
换成jdk6.0就不会出现这种情况了
个人认为,这种功能的升级是出于安全性考虑
当然在思维上也更加严谨,让所有要存到TreeSet中的对象,都必须具有可比性

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
谢波 发表于 2013-4-8 09:45
出现第一次和自己比的情况呢
应该是用的jdk7.0
换成jdk6.0就不会出现这种情况了

谢谢,明了了。
回复 使用道具 举报
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马