为什么treeset有一个单独的构造函数用于sortedset,而任何集合都有一个构造函数?

7z5jn7bk  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(238)

任何集合的构造函数: public TreeSet(Collection<? extends E> c) sortedset的独立构造函数: public TreeSet(SortedSet<E> s) 为什么需要为sortedset单独设置一个?

e5njpo68

e5njpo681#

从接受 SortedSet :
构造一个新的树集,该树集包含与指定的排序集相同的元素并使用相同的顺序。
初始化时 TreeSetCollection ,使用元素的自然顺序,从接受 Collection :
构造一个新的树集,其中包含指定集合中的元素,并根据其元素的自然顺序进行排序。

tvmytwxo

tvmytwxo2#

treeset医生 public TreeSet(Collection<? extends E> c) 构造一个新的树集,其中包含指定集合中的元素,并根据其元素的自然顺序进行排序。插入到集合中的所有元素都必须实现可比较的接口。此外,所有这些元素必须是相互可比较的:e1.compareto(e2)不能为集合中的任何元素e1和e2抛出classcastexception。
注意“按元素的自然顺序排序” public TreeSet(SortedSet<E> s) 构造一个新的树集,该树集包含与指定的排序集相同的元素并使用相同的顺序。

woobm2wo

woobm2wo3#

让我们用两种不同的方式运行这个程序,

public static void main(String[] args) {
    List<User> ul = new ArrayList<>();
    ul.add(new User());
    ul.add(new User());

    Set<User> users = new TreeSet<>(ul);
}

首先是下面(这里我们实现的是comparator)

private static class User implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        return 0;
    }
}

对于这个程序,它在线程“main”java.lang.classcastexception中抛出异常:test.wtest$user不能转换为java.lang.com
因为此构造函数期望用户实现java.util.interface。
第二次运行,如果您将用户类实现更改为

private static class User implements Comparable<User> {

    @Override
    public int compareTo(User o) {
        return 0;
    }
}

代码运行得很好!注意实现的不同,现在我们实现java.lang.comparable接口。
但是treeset类同时使用这两种方法,或者使用comparator,或者comparable。因此,构造函数的选择完全取决于对象的实现类型。

相关问题