gpt4 book ai didi

java - 为什么 Collections.addAll 应该比 c.addAll 快

转载 作者:IT老高 更新时间:2023-10-28 20:53:43 26 4
gpt4 key购买 nike

Java API docs say以下关于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.

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

一)

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);

谁能给我解释一下,为什么会这样?

编辑:更正的代码示例。感谢 polygenelubricants

最佳答案

让我们仔细看看他们两个:

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

会发生什么:

  1. 可变参数 + 自动装箱创建 Integer[]
  2. Arrays.asList创建一个 List<Integer>由数组支持
  3. addAll遍历 Collection<Integer>使用 Iterator<Integer>
// b)
Collections.addAll(col, 1, 2, 3, 4, 5);

会发生什么:

  1. 可变参数 + 自动装箱创建 Integer[]
  2. addAll遍历数组(而不是 Iterable<Integer>)

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

  • Arrays.asList调用被跳过,即没有中介 List已创建。
  • 由于元素是在数组中给出的(感谢可变参数机制),迭代它们可能比使用 Iterator 更快.

也就是说,除非配置文件另有显示,否则差异不太可能“显着”。不要过早优化。虽然 Java 集合框架类可能比数组慢,但对于大多数应用程序来说,它们的性能已经足够了。

API 链接

另见

相关问题


总结

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

关于java - 为什么 Collections.addAll 应该比 c.addAll 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com