TreeSet和compareTo()方法。单个排序或多个排序

时间:2013-08-26 20:44:52

标签: java hashset compareto treeset

我目前正在开发一个程序,我使用TreeSet存储唯一键。我正在使用TreeSet,因为我希望它们已经排序。

截至目前,我一直在制作一个TreeSet对象,并在需要时一次一个地添加字符串。

TreeSet set = new TreeSet();
set.add("How");
set.add("Are");
set.add("You");

据说,TreeSet使用compareTo中的Compareable interface方法对字符串进行排序。这意味着每次向其添加字符串时,TreeSet都必须进行排序。

现在我的问题是:创建HashSet然后在TreeSet添加到HashSet后创建all strings会更高效吗?

TreeSet<String> treeSet = new TreeSet<String>(set);

我的想法是关于TreeSet是否只需要以这种方式进行单一排序。

提前致谢

3 个答案:

答案 0 :(得分:5)

TreeSetSelf-balancing binary search tree。这意味着它将对每个插入进行log(n, 2)比较。如果您单独添加元素或从其他集合创建TreeSet,则没有任何区别。

答案 1 :(得分:0)

它内部调用“addAll()”方法没有任何区别,反过来,一次添加一个元素

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    Iterator<? extends E> e = c.iterator();
    while (e.hasNext()) {
        if (add(e.next()))    //< -- Add one element at a time
           modified = true;
    }
    return modified;
}

答案 2 :(得分:0)

ConcurrentSkipListSet可能会提供更好的性能,具体取决于。

这是基于已排序的SkipList的实现。渐近性能是O(log n),就像TreeSet一样,但它通常应该更快,并且存储更紧凑。另外,java还包含implementation

根据实现情况,从排序的arraylist创建skiplist列表可能会更快。批量添加通常比一个更快(取决于实现)。 TreeSet表示异常。简介并找出答案!