java - 直接在 Treeset 中添加元素与从 arraylist 传输元素的性能有何差异?

标签 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());

或者,

   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 类的一个对象(也可以是其他任何对象)。任何帮助将不胜感激。提前致谢。

最佳答案

仅当 cSortedSet 的实例时,

TreeSet.addAll(c) 方法才会进行优化。在其他情况下,它只是迭代集合并逐个添加元素。

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

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

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

关于java - 直接在 Treeset 中添加元素与从 arraylist 传输元素的性能有何差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30724230/

相关文章:

java - 在 ubuntu 上启动 Spring boot 应用程序但花费太多时间

java - 单元测试编译时织入

java - Big O中一般Hash表和java的HashMap的区别

c - 维基百科上的内存映射循环缓冲区有多好?

Java 全部替换

java - 为什么 writeBytes 会丢弃每个字符的高八位?

java 从 csv 文件中读取并将其信息存储到 ArrayList<class>

Java:使用文件读取器在 while 循环中添加到字符串数组

java - 递归归并排序仅返回 ArrayList 的前半部分

c++ - 使用 C++ 的最近最少使用缓存