黑马程序员技术交流社区

标题: 关于TreeSet集合中compareTo的调用 [打印本页]

作者: 自信流云    时间: 2015-1-20 14:48
标题: 关于TreeSet集合中compareTo的调用
import java.util.*;
public class TreeSetDemo
{
        public static void main(String [] args)
        {
                TreeSet ts=new TreeSet();
                ts.add(new Student("zhangsan1",1));
                /*ts.add(new Student("zhangsan2",3));
                ts.add(new Student("zhangsan3",1));
                ts.add(new Student("zhangsan4",5));
                ts.add(new Student("zhangsan5",1));*/
                Iterator i=ts.iterator();
                while(i.hasNext())
                {
                        Student s=(Student)i.next();
                        sop(s.getName()+":"+s.getAge());
                }
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}
class Student implements Comparable
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
        public int compareTo(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new RuntimeException("传入的不是学生对象");
                Student s=(Student)obj;
                System.out.println(this.name+"调用compareTo方法,与"+s.name+"比较");
                if(age>s.age)
                        return 1;
                else if(age==s.age)
                {
                        return s.name.compareTo(name);
                }
                return -1;       
        }
}
/**************************/
这个是仿照毕老师的TreeSet集合类中例子的代码写的。运行结果如下:
/*************************/
zhangsan1调用compareTo方法,与zhangsan1比较
zhangsan1:1
/*************************/
为什么往空的TreeSet集合ts中传一个Student对象zhangsan1,它会自动调用compareTo方法?
看运行结果是zhangsan1自己调用了compareTo方法,并且把自己作为参数传了进去;但是毕老师的视频里,放第一个对象的时候,并没有显示第一个对象调用了compareTo方法与自己作比较。求指教

作者: lwj123    时间: 2015-1-20 17:23
/*
* 给你看看源码你就知道了:
* 首先从ts.add(new Student("zhangsan1"),1);
* 源码:TreeSet.class
* public boolean add(E e) {
*     return m.put(e, PRESENT)==null;
* }
*//TreeMap.class
*  private transient Entry<K,V> root = null;
*  public V put(K key, V value) {
*      Entry<K,V> t = root;//默认值为null
*      if (t == null) {
*        compare(key, key); // 集合为空,就跟自己比较
*      }
*  }
*/
作者: 自信流云    时间: 2015-1-21 10:50
lwj123 发表于 2015-1-20 17:23
/*
* 给你看看源码你就知道了:
* 首先从ts.add(new Student("zhangsan1"),1);

毕老师视频里,他的运行结果没有显示第一个对象在进入空集合时,会调用compareTo方法。很疑惑,这个是JDK版本的原因吗?
作者: lwj123    时间: 2015-1-21 14:22
自信流云 发表于 2015-1-21 10:50
毕老师视频里,他的运行结果没有显示第一个对象在进入空集合时,会调用compareTo方法。很疑惑,这个是JDK ...

我看源码的话是这样的,你可以尝试的去查阅一下源码就知道了。




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