我目前正在开发一个程序,我使用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是否只需要以这种方式进行单一排序。
提前致谢
答案 0 :(得分:5)
TreeSet
是Self-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表示异常。简介并找出答案!