1

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

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

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

假设 TreeSet 使用 , 中的compareTo方法Compareable interface对字符串进行排序。这意味着每次我向 TreeSet 添加一个字符串时,它都必须进行排序。

现在我的问题是:创建一个HashSet然后创建将其添加到 HashSet 会更有效吗?TreeSetall strings

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

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

提前致谢

4

3 回答 3

5

TreeSet是一个自平衡二叉搜索树。这意味着它将log(n, 2)对每个插入进行比较。如果您单独添加元素或TreeSet从另一个集合创建元素,则没有区别。

于 2013-08-26T20:48:24.403 回答
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;
}
于 2013-08-26T20:54:00.317 回答
0

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

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

根据实现,从排序的arraylist 创建skiplist 列表可能会更快。批量添加通常比逐个添加更快(取决于实现)。TreeSet 代表某种异常。配置文件并找出答案!

于 2013-08-26T20:55:46.190 回答