【问题标题】:Performance or memory consumption difference between Array and ArrayListArray 和 ArrayList 之间的性能或内存消耗差异
【发布时间】:2015-02-21 21:05:29
【问题描述】:

我发现与在日常编码中使用数组相比,使用ArrayList 几乎可以轻松完成任何事情,而且控制力更强。 所以我问:

  1. 如果我可以改用ArrayList,是否适合避免使用数组?
  2. 当我将数组替换为 ArrayList 时,是否需要考虑内存方面的问题?

【问题讨论】:

  • 你说的list是指List接口吗?
  • @Kick Buttowski ex: ArrayList
  • 性能方面,在数组中添加和检索条目更快(稍微)。但是,List 提供了更多方法来操作其内容。而且,根据 Joshua Bloch 在他的 effective java 中的说法,他建议在数组上使用列表,基本上是因为“数组和泛型不会混合”。毫无疑问,我会选择 List。
  • @Jimmy 你为什么不回答这个问题?

标签: java performance arraylist


【解决方案1】:

在另一个之上使用肯定会影响性能和效率,尽管它可能非常小。 JVM 的实施也有很大影响。但是,从arrays 添加和获取条目总是比在List 中更快。如果您确定所需的array 的大小,那么在使用数组时您可能也节省了很少的内存。 但是,List 为您提供了修改内容的更大灵活性,基本上是很多操作数据的方法。它完全支持generics。 由于数组是 covariant 和泛型是 invariantArrays and Generics don't mix 所以Joshua Bloch 建议在他的书Effective Java II 第25章中使用列表而不是数组。我一定会遵循他的建议并建议您也使用列表的数组。

【讨论】:

  • 谢谢!,我得到了一本 Effective Java(第 2 版),看来 JAVA 知识非常丰富。非常感谢您的参考。
  • 不客气,确实是一本好书。
【解决方案2】:

在 Array 和 ArrayList 之间进行具体选择时,您首先要考虑的应该是容器的长度是否需要更改。如果是,请使用 ArrayList,但即使没有,我仍然会说您应该使用 ArrayList。这样做的原因是,使用 ArrayList 所产生的性能开销通常不足以保证用 Array 代替它,除非您绝对知道性能将是一个问题。

一般来说,我认为在大多数情况下使用列表而不是数组是一个更好的主意。由于减少了开销,阵列确实提供了稍高的性能。但是,由于 List 是一个接口,因此有许多特定的实现可用(ArrayList、LinkedList 等),这为您和客户端代码提供了更大的灵活性。

例如,如果您要编写一个执行某些计算并返回 List 的方法,则客户端代码将只能假定返回的 List 是根据其在 Java 文档中的定义构造的。

例如,在客户端代码中,您可能会发现如下内容:

List<T> list = foo.getList();

如果方法 getList() 当前返回一个 ArrayList,并且您想更改它的行为以使其现在返回一个 LinkedList,您将能够做到这一点,而不必担心破坏使用您的方法的客户端代码。仅假设它会收到 一些 List 的实现,但不会收到任何特定的实现。

【讨论】:

    【解决方案3】:
    1. 如果我可以使用 List 代替这种情况,是否适合避免使用数组。

      在某些情况下,您可能希望在列表上使用数组。我建议你学习“Big-O notation”。另外,请记住,您可以使用列表并通过调用yourList.toArray(yourArray) 方法转换为数组。您也可以使用 Arrays 类 (Arrays.asList(yourArray)) 来做相反的事情。出于显而易见的原因,使用List 比使用数组更通用,但如果您的数据集很小,使用数组可能比使用列表更有效。

    2. 当我用 List 替换数组(使用列表而不是数组)时,我是否需要考虑内存方面的问题。

      您需要牢记的最重要的内存注意事项是内存分配。一旦你创建了一个数组,你就不能扩大或缩小它的大小。如果您需要一个大小为 1M 的对象数组(比如说 100 个项目),在该数组被垃圾回收之前,您为该对象(数组)分配了 100MB。使用列表,如果您想删除或添加项目,您可以轻松完成;从而减少或增加列表的内存占用。

    【讨论】:

    • 你能更具体地回答ArrayList吗?
    • @OrangeDog 您对哪些具体细节感兴趣?
    • 如果您对更多“Big-O”信息感兴趣,可以查看cheat-sheet
    • 什么是小型数据集?我有一个大约 200 行的数据集。你认为它是小还是大?
    • @LuckMan 我认为那很小。在网上搜索基准。
    【解决方案4】:

    ArrayList 为我们提供了许多简单数组无法实现的功能,我们必须为我们可以在 Arraylist 中一步完成的事情编写大方法。 因此 ArrayList 比简单数组需要更多的内存消耗,但是您可以继续在不会产生太大影响的小程序中使用,但是在处理大量数据和性能问题时,如果您可以使用简单数组,请不要使用 ArrayList 作为数组要快得多。

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 2017-09-21
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2016-03-17
      • 2017-02-09
      相关资源
      最近更新 更多