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