zoukankan      html  css  js  c++  java
  • Collections.addAll 为什么比collection.addall 快(转)

    from: http://stackoverflow.com/a/3343829/5032462

    在stackoverflow上看到的一篇回答,老外真是太professional了,mark一下。最后的summary值得看一下。

    The Java API docs say the following about Collections.addAll

    The behavior of this convenience method is identical to that of c.addAll(Arrays.asList(elements)), but this method is likely to run significantly faster under most implementations.

    So if I understand correctly, a) is slower than b):

    a)

     Collection<Integer> col = new ArrayList<Integer>();
     col.addAll(Arrays.asList(1, 2, 3, 4, 5));

    b)

    Collection<Integer> col = new ArrayList<Integer>();
    // Collections.addAll(col, Arrays.asList(1, 2, 3, 4, 5)); <-- won't compile
    Collections.addAll(col, 1, 2, 3, 4, 5);

    Let's take a closer look at the two of them:

    // a)
    col.addAll(Arrays.asList(1, 2, 3, 4, 5));

    Here's what happens:

    1. varags + autoboxing creates Integer[]
    2. Arrays.asList creates a List<Integer> backed by the array
    3. addAll iterates over a Collection<Integer> using Iterator<Integer>
    // b)
    Collections.addAll(col, 1, 2, 3, 4, 5);

    Here's what happens:

    1. varargs + autoboxing creates Integer[]
    2. addAll iterates over an array (instead of an Iterable<Integer>)

    We can see now that b) may be faster because:

    • Arrays.asList call is skipped, i.e. no intermediary List is created.
    • Since the elements are given in an array (thanks to varargs mechanism), iterating over them may be faster than using Iterator.

    That said, unless profiling shows otherwise, the difference isn't likely to be "significant". Do not optimize prematurely. While Java Collection Framework classes may be slower than arrays, they perform more than adequately for most applications.

    API links

    See also

    Related questions


    Summary

    • If you're adding elements from an array, you can use Collections.addAll(col, arr)
      • Remember that varargs are also done using arrays
    • If you're adding elements from a Collection, use col.addAll(otherCol)
      • Do NOT e.g. Collections.addAll(col, otherCol.toArray())
        • Such roundabout way is likely to be slower!
    • It's not that one is supremely faster than the other
      • It's about skipping unnecessary steps given the current situation
  • 相关阅读:
    oracle中的一些基本概念
    Oracle角色、权限的一些常用视图
    Oracle 11g的Deferred Segment Creation
    Oracle 11g导出空表、少表的解决办法
    Java输入输出流
    URL 长度有限制吗?
    hibernate---步骤
    Struts+Spring+Hibernate整合入门详解
    SSH框架总结(框架分析+环境搭建+实例源码下载)
    Spring实战1:Spring初探
  • 原文地址:https://www.cnblogs.com/BJUT-2010/p/5577977.html
Copyright © 2011-2022 走看看