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

2024-04-27

The Java API 文档说 http://java.sun.com/javase/6/docs/api/java/util/Collections.html#addAll(java.util.Collection,%20T...)以下关于Collections.addAll

此便捷方法的行为与 c.addAll(Arrays.asList(elements)) 的行为相同,但此方法在大多数实现下可能运行速度明显更快。

所以如果我理解正确的话,a) 比 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);

谁能向我解释一下这是为什么?

编辑: 更正的代码示例。谢谢多基因润滑剂 https://stackoverflow.com/users/276101/polygenelubricants


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

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

发生的情况如下:

  1. varags + 自动装箱创建Integer[]
  2. Arrays.asList创建一个List<Integer>由数组支持
  3. addAll迭代一个Collection<Integer> using Iterator<Integer>
// b)
Collections.addAll(col, 1, 2, 3, 4, 5);

发生的情况如下:

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

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

  • Arrays.asList呼叫被跳过,即没有中介List被建造。
  • 由于元素是在数组中给出的(感谢 varargs 机制),因此迭代它们可能比使用更快Iterator http://java.sun.com/javase/6/docs/api/java/util/Iterator.html.

也就是说,除非分析表明有其他情况,否则差异不太可能是“显着的”。不要过早优化。虽然 Java Collection Framework 类可能比数组慢,但它们对于大多数应用程序来说性能已经足够了。

API链接

  • Collections.addAll(Collection<? super T> c, T... elements) http://java.sun.com/javase/6/docs/api/java/util/Collections.html#addAll%28java.util.Collection,%20T...%29- 可变参数,即基于数组
  • Collection.addAll(Collection<? extends E> c) http://java.sun.com/javase/6/docs/api/java/util/Collection.html#addAll%28java.util.Collection%29 - Collection-based

See also

  • Java 语言指南/自动装箱 http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
  • Java 语言指南/Varargs http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html
  • 《Effective Java》第二版,第 25 条:优先使用列表而不是数组

相关问题

  • Java 中的数组或列表。哪个更快? https://stackoverflow.com/questions/716597/array-or-list-in-java-which-is-faster

Summary

  • If you're adding elements from an array, you can use Collections.addAll(col, arr)
    • 请记住,可变参数也是使用数组完成的
  • If you're adding elements from a Collection, use col.addAll(otherCol)
    • Do NOT e.g. Collections.addAll(col, otherCol.toArray())
      • 这样迂回的方式很可能会比较慢!
  • It's not that one is supremely faster than the other
    • 这是关于在当前情况下跳过不必要的步骤
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Collections.addAll 应该比 c.addAll 更快 的相关文章

  • 构建 jar 后无法运行 exe

    我制作了一个简单的实用应用程序 其中我有一个要运行的exe文件 我通过使用它来运行 Runtime getRuntime exec this getClass getResource filename exe getPath 当我从 ide
  • Java 中的 sscanf 等效项[重复]

    这个问题在这里已经有答案了 可能的重复 用于使用已知模式解析字符串中的值的 sscanf 的 Java 等效项是什么 https stackoverflow com questions 8430022 what is the java eq
  • 修改 Settings.apk 以与 Project Glass 配合使用

    我正在尝试构建要在 Google I O 的 Hacking Glass 会议上在 Glass 上使用的 Settings apk 他提到 为了让设置 apk 正常工作 需要修改清单中的一行 这是 AOSP 清单 http pastebin
  • getAnnotations() 为空

    我想在我的应用程序中使用注释 因此 我为注释创建了 hello world 如下示例 public class HelloAnnotation Foo bar Hello World public String str public sta
  • Android 中的 ImageView 拖动限制

    我在布局中有一个 ImageView 并在 ImageView 上设置 OnTouchListener 来拖动 ImageView 它工作得很好 我的问题是如何防止将 ImageView 移动到布局范围之外 这是我的代码 活动类别 publ
  • Spring Boot 是否支持服务器名称指示(SNI)?

    Spring Boot 是否支持服务器名称指示 SNI 具体来说 运行嵌入式 Tomcat 服务器并打包为可执行 jar 文件的 Spring Boot 2 2 2 RELEASE 应用程序是否可以根据传入请求的主机名支持多个 SSL 证书
  • Postgres UUID 和休眠

    我有一个具有 UUID 列的实体 它不是主键 我正在使用 Postgres 和 hibernate 我对此专栏的类型是https www postgresql org docs 9 1 static datatype uuid html h
  • 如何使用spring data mongodb在mongodb中创建视图

    如何使用spring data mongodb在mongodb中创建视图 谢谢 您可以在需要的地方注入 org springframework data mongodb core MongoTemplate 类型的 bean 并使用其方法之
  • Spring Boot,使用 EhCache 进行缓存

    我需要在我的应用程序中缓存一些数据 我正在考虑使用 Ehcache 我有几个问题 Ehcache需要另外一台服务器吗 我需要其他客户端来使用 Ehcache 吗 Ehcache 如何与多个实例配合使用 是否有可能使用 Ehcache 创建类
  • 如何为我的数独游戏制作 GUI? (摇摆)

    到目前为止 我已经编写了生成随机 9x9 数独网格的代码 我是Java的初学者 所以我有一些关于如何做UI的问题 显示数字的最佳方式是什么 我尝试创建 81 个 JTextFields 这非常乏味 而且我确信有一种有效的方法可以做到这一点
  • 使用 Hibernate 作为 ORM 机制的 Web 应用程序中的 L1 和 L2 缓存有什么区别?

    我只想要一些有关使用 L1 缓存和 L2 缓存的标准用途的一般信息 我很好奇 因为我正在研究使用赤土陶器作为二级缓存的系统 并且我发现它也有一级缓存 L1 缓存是每个 Hibernate 会话都存在的缓存 并且该缓存不在线程之间共享 该缓存
  • 带有 CONTAINS 查询的PreparedStatement

    我有一个查询需要连续运行 28000 次 所以我认为使用准备好的语句可能是一个聪明的主意 这是我的查询 String requestWithFirstName SELECT SE ELEMENT ID SE LASTNAME SE FIRS
  • 如何将 JAVAX-WS 端点绑定更改为 SOAP 1.2?

    我正在使用发布测试 WS 实现Endpoint publish 用于在 Visual Studio 中使用 根据文档 http metro java net nonav 1 2 docs endpoint html默认的 SOAP 绑定是1
  • 如何获取嵌套类型内部结构的所有类型?

    我有一个函数如下 public void park List
  • jstack 是否停止在较新的 JDK8 版本上工作?

    我惊讶地发现 不知何故 最近 jstack 停止了在较新的 JDK 8 上的工作 我不确定这发生在哪个版本 但我确实得到 36649 Unable to open socket file target process not respond
  • 更改 Logger 实例的全局设置

    我在用着java util logging Logger http download oracle com javase 1 4 2 docs api java util logging Logger html作为我的应用程序的日志引擎 每
  • Java中如何对整数除法进行四舍五入并得到int结果? [复制]

    这个问题在这里已经有答案了 我刚刚写了一个小方法来计算手机短信的页数 我没有选择使用Math ceil 老实说 它看起来很丑陋 这是我的代码 public class Main param args the command line arg
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • 在 Eclipse Testrunner 中使用名称的 ParameterizedTest

    当您使用 Eclipse TestRunner 运行 JUnit 4 ParameterizedTest 时 图形表示相当愚蠢 对于每个测试 您都有一个名为 0 1 ETC 是否可以进行测试 0 1 等显式名称 实施一个toString测试

随机推荐