为什么Collections.addAll应该比c.addAll更快

der*_*oni 36 java collections performance

Java的API文档说有关以下Collections.addAll

这种方便方法的行为与c.addAll(Arrays.asList(elements))的行为相同,但在大多数实现中,此方法可能运行得更快.

所以,如果我理解正确,a)比​​b)慢:

一个)

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

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);
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释,为什么会这样?

编辑:更正的代码示例.thx到polygenelubricants

pol*_*nts 49

让我们仔细看看其中两个:

// a)
col.addAll(Arrays.asList(1, 2, 3, 4, 5));
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

  1. varags + autoboxing创造 Integer[]
  2. Arrays.asList创建一个List<Integer>由数组支持
  3. addAll迭代Collection<Integer>使用Iterator<Integer>
// b)
Collections.addAll(col, 1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

  1. varargs + autoboxing创造 Integer[]
  2. addAll迭代一个数组(而不是一个Iterable<Integer>)

我们现在可以看到b)可能更快,因为:

  • Arrays.asList跳过调用,即没有List创建中介.
  • 由于元素是以数组形式给出的(由于varargs机制),迭代它们可能比使用它更快Iterator.

也就是说,除非剖析显示其他情况,否则差异可能不大"重要".不要过早优化.虽然Java Collection Framework类可能比数组慢,但它们对大多数应用程序的执行效果都不错.

API链接

也可以看看

相关问题


摘要

  • 如果要从数组中添加元素,则可以使用 Collections.addAll(col, arr)
    • 请记住,varargs也是使用数组完成的
  • 如果您要添加a中的元素Collection,请使用col.addAll(otherCol)
    • 难道不是Collections.addAll(col, otherCol.toArray())
      • 这种迂回的方式可能会慢一些!
  • 并不是说一个人比另一个人快得多
    • 这是关于在当前情况下跳过不必要的步骤