TreeSet的以下两个构造函数之间有什么区别?

时间:2017-03-27 15:55:41

标签: java collections

对于TreeSet<E>,定义了以下两个构造函数:

  1. TreeSet<E>(Collections<? extends E> c)
  2. TreeSet<E>(SortedSet<E> ss)
  3. 第二种选择需要什么?第一个构造函数不会与整个集合框架范围的对象兼容吗? 即,如果我们需要将SortedSet转换为TreeSet obj,我们是否可以使用第一个构造方法?

    请在这方面澄清。

3 个答案:

答案 0 :(得分:2)

除了Collection<E>之外,SortedSet<E>还可以访问其自定义比较器:

Comparator<? super E> comparator()    

构造函数的这个重载让新创建的TreeSet<E>使用与被复制的有序集相同的自定义排序器。

以下是展示差异的代码:

public static void main (String[] args) throws java.lang.Exception
{
    Set<String> a = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
    SortedSet<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
    populate(a);
    show(a, "Original a");
    populate(b);
    show(b, "Original b");
    Set<String> copyA = new TreeSet<String>(a);
    show(copyA, "Copy of a");
    Set<String> copyB = new TreeSet<String>(b);
    show(copyB, "Copy of b");
}
static void populate(Set<String> s) {
    s.add("A");
    s.add("aa");
    s.add("B");
    s.add("bb");
}
static void show(Set<String> s, String name) {
    System.out.println("============ "+name+" ==========");
    for (String t : s) {
        System.out.println(t);
    }
}

这会产生以下输出:

============ Original a ==========
A
aa
B
bb
============ Original b ==========
A
aa
B
bb
============ Copy of a ==========
A
B
aa
bb
============ Copy of b ==========
A
aa
B
bb

请注意,复制的a的顺序与原始顺序不同,而复制的b的顺序与原始顺序保持一致。

Demo.

答案 1 :(得分:0)

嗯,在第一种情况下,维护集合元素的自然排序,而在第二种情况下,保留SortedSet的顺序。区别因素是TreeSet中元素的排序。

您还可以使用TreeSet的其他构造函数设置自定义排序。

请查看文档以供进一步参考。

答案 2 :(得分:0)

TreeSet(SortedSet ss)构造函数使用与ss参数相同的ording,而TreeSet(Collections c)强制使用其元素的“自然顺序”。

Docs解释了这一点。