【问题标题】:Primitive Array vs ArrayList原始数组与 ArrayList
【发布时间】:2011-10-23 21:07:19
【问题描述】:

我正在接收 XML,需要转换为原始数组或 ArrayList。 在内存和垃圾收集方面的性能方面有很大差异吗? 我的应用程序每秒会创建数千个这样的对象,我需要最小化 GC,因为我需要实时性能。

谢谢

【问题讨论】:

标签: java arrays arraylist


【解决方案1】:

原始数组效率更高,因为它们不需要包装对象。 Guava 具有由原始数组支持的 List 实现(例如:Ints.asList(int[])),也许这对您来说是一个合理的解决方案:获得集合的力量,但仅在您真正需要时才使用对象。

【讨论】:

  • Guava List 实现不也是包装对象吗?
  • 您是否有任何关于它们效率更高的量化细节?
  • @TedHopp 是的,每个数组一个包装对象,但不是每个数组元素一个
  • @DD。不,但你可以在 guava 邮件列表中询问 google 人员
  • "_but not one per array element" -- ArrayList 没有这样的每个元素的对象开销。我相信它们与原始数组一样节省空间(顺便说一下,它们也是包含连续引用块和计数的包装器对象)。
【解决方案2】:

原始数组总是更有效,但效率多少取决于用例的具体细节。我最近将性能提高了 7 倍,方法是在最内层的循环中删除 ArrayList,并用原始数组替换它们。用例是一个 O(n^2) 算法,适用于 100-1000 个字符长的列表。然后我做了一个对照实验,将 int[] 数组的性能与 ArrayList 进行比较,有趣的是,随着数组/列表大小变大,JIT 编译器似乎开始起作用,并且性能损失变得更少(仅约 20%)。但是对于小于 500 的列表大小,ArrayList 的性能损失可能高达 10 倍。因此,如果您有一个经常调用的方法,它正在操作许多小列表或数组(就像我的用例一样) ),使用 primitave 数组会对性能产生很大影响。

【讨论】:

    【解决方案3】:

    正如 Sean Patrick Floyd 所指出的,原始数组的效率要高得多。 但是,在某些情况下,肯定会更喜欢 Collections。但只要你只是迭代对象,就不需要集合。

    【讨论】:

      【解决方案4】:

      链表适用于插入/删除,数组适用于随机访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多