黑马程序员技术交流社区

标题: sorted_map=new TreeMap(map)用的是哪个构造函数? [打印本页]

作者: 张晋瑜    时间: 2013-2-17 16:36
标题: sorted_map=new TreeMap(map)用的是哪个构造函数?
本帖最后由 zhangjinyu1991 于 2013-2-20 13:01 编辑

Map map=new HashMap<>();
Map sorted_map=new TreeMap(map);
TreeMap有以下构造函数:
public TreeMap();
public TreeMap(Comparator<? super K> comparator);
public TreeMap(Map<? extends K, ? extends V> m);
public TreeMap(SortedMap<K, ? extends V> m);
我就是不知道它用的是哪个?第三个吗,可是这样的话排序在哪里呢?就是在哪里完成了排序功能?

作者: 王亚东    时间: 2013-2-17 22:08
首先Map<? extends K, ? extends V>作为参数传给TreeMap<K,V>,map中的key需要是TreeMap中的key的子类,value也一样;
其次,根据TreeMap的firstKey() (返回此映射中当前第一个(最低)键。 )方法,可以得知,在创建TreeMap对象的时候就已经排好序了。
作者: 陈科宇    时间: 2013-2-18 14:35
对TreeMap和TreeSet而言,排序都是在存入对象时根据你的存入对象的comparable方法来排序的。
作者: 陈科宇    时间: 2013-2-18 14:41
class Student
{
       
}
public class TreeSetTest {
   public static void main(String[] args)
   {
           Set<Student> set=new TreeSet<Student>();
       set.add(new Student());
       set.add(new Student());
   /*
    * java.lang.ClassCastException:com.keyee.test.heima.Student cannot be cast to java.lang.Comparable
    * 知道为什么会报错吗?就是因为排序是在这个存入对象阶段完成的。在存入第二个元素时,就会调用Student对象的comparable方法。
    * 结果它没有实现Comparable接口,JVM有点小失望,就报错了。
    */
   }
   
}

作者: 王钊    时间: 2013-2-18 22:54
哥们我给你讲:
首先,调用的肯定是public TreeMap(Map<? extends K, ? extends V> m)这个构造函数,因为你传入的参数是一个实现了Map接口的类,
而最后一个构造函数是SortedMap,SortedMap是Map的子接口,你的map只是实现了Map接口,并没有声明实现SortedMap接口,所以最后一个构造函数不能接收。
其次,你不知道如何排序的。看下面:
构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。插入此新映射的所有键都必须实现 Comparable 接口。
这句话是api关于public TreeMap(Map<? extends K, ? extends V> m)的介绍。
也就是说用了这个构造函数就不能传入Comparator比较器了,要使用自然顺序,因此你最开始放入map里面的元素,要实现Comparable接口。这样才能完成比较。




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