在Treeset中直接添加元素与从arraylist转移的性能差异?

时间:2015-06-09 06:12:16

标签: java arraylist data-structures treeset

我想知道在TreeSet中逐个添加元素与在ArrayList中添加元素然后通过.addAll()方法传输到TreesSet之间的性能差异。我知道TreeSet使用红黑树作为其数据结构。只想了解这两个过程的基本内部工作原理。以下哪一项会更快,为什么?

    TreeSet<Integer> ts = new TreeSet<Integer>();   
    for(int i=0;i<n;i++)
        ts.add(sc.nextInt());

OR,

   TreeSet<Integer> ts = new TreeSet<Integer>();    
   ArrayList<Integer> ar = new ArrayList<Integer>();
        for(int i=0;i<n;i++)
            ts.add(sc.nextInt());

            ts.addAll(ar);

这里sc是Scanner类的一个对象(它也可能是其他任何东西)。任何帮助将深表感谢。提前谢谢。

2 个答案:

答案 0 :(得分:2)

仅当TreeSet.addAll(c)c的实例时,

SortedSet方法才会执行优化。在其他情况下,它只是迭代集合并逐个添加元素。

因此,首先将元素放入ArrayList然后使用TreeSet.addAll(list)方法没有任何意义。您将获得更差的性能和更高的内存消耗。

从大O角度来看,这两种解决方案都有n*log(n)的复杂性。

EDIT。 TreeSet有两个重要的属性:元素是唯一的,它们是有序的。如果您只对unique-elements属性感兴趣,那么使用HashSet会使您的复杂性为n

答案 1 :(得分:0)

仅在传递给Collection的{​​{1}}为addAll(Collection)instanceof SortedSet时,树创建时间为线性。

在第二种情况下,创建instanceof TreeMap需要额外的时间。由于ArrayList内部调用TreeSet#addAll循环

中的Collection#add(),因此保持不变

因此,如果收藏品不可用,最好拨打for然后add

相关问题