Java 直接在Treeset中添加元素与从arraylist传输元素在性能上的差异?

Java 直接在Treeset中添加元素与从arraylist传输元素在性能上的差异?,java,arraylist,data-structures,treeset,Java,Arraylist,Data Structures,Treeset,我想知道在树集合中逐个添加元素与在ArrayList中添加元素,然后通过.addAll()方法传输到树集合之间的性能差异。我知道TreeSet使用红黑树作为其数据结构。只想知道这两个过程的基本内部工作原理。以下哪项速度更快?为什么 TreeSet<Integer> ts = new TreeSet<Integer>(); for(int i=0;i<n;i++) ts.add(sc.nextInt()); TreeSet ts

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

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

对于(int i=0;i,仅当传递给
addAll(Collection)
集合
是排序集的
实例,且
树映射的
实例时,树的创建时间是线性的

在第二种情况下,创建
ArrayList
需要额外的时间。其余部分相同,因为
TreeSet\addAll
for
循环中内部调用
Collection\add()

因此,如果集合已经不可用,那么最好调用
add
然后调用
addAll
。addAll(c)
方法仅当
c
SortedSet
的一个实例时才进行优化。在其他情况下,它只是迭代集合并逐个添加元素

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

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


EDIT.TreeSet有两个重要属性:元素是唯一的,并且它们是经过排序的。如果您只对unique Elements属性感兴趣,那么使用哈希集将使您的复杂性达到
n

Hi Nitin,谢谢您的回答,但是addAll()方法在for循环之外。我知道在您的代码中
addAll
for
循环之外,我提到了
addAll
方法的
java.util.TreeSet
中使用的
for
循环,以防
Collection
不是SortedSet和TreeMap的
实例。谢谢您的回答。我认为re-o在上述两种不同的操作中,树集中节点的排序将不同。@Nitin Dandriyal:n插入每个获取日志(n)-对我来说,它听起来像n*log(n)。
   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);