数组和ArrayList之间的性能或内存消耗差异

11

我发现在日常编程中,使用 ArrayList 比使用数组更容易且有更多的控制。

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

1
当您说列表时,您是在谈论List接口吗? - Kick Buttowski
1
就性能而言,添加和检索数组中的条目更快(略微)。然而,列表提供了更多操作其内容的方法。此外,根据乔书亚·布洛克在他的《Effective Java》一书中的建议,他推荐使用List而不是数组,基本上是因为“数组和泛型不搭配”。毫无疑问,我会选择List。 - Jimmy
相关链接:http://stackoverflow.com/q/8937560/476716 - OrangeDog
@Jimmy,为什么不把那个变成一个答案呢? - OrangeDog
@Jimmy 是的,请把它作为一个答案。 - Lalith J.
显示剩余3条评论
4个回答

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

3
谢谢!我已经得到了《Effective Java(第二版)》的副本,看起来是一本很好的JAVA知识参考书。非常感谢你提供这个参考资料。 - Lalith J.
2
非常欢迎,这确实是一本好书。 - Jimmy

4

当在一个数组和ArrayList之间做出选择时,首先要考虑的是容器的长度是否需要更改。如果需要更改,则使用ArrayList;即使不需要更改,我仍然会建议使用ArrayList。原因是使用ArrayList所产生的性能开销通常不足以证明用Array进行替代,除非你绝对确定性能将成为一个问题。

一般来说,在大多数情况下,使用List比使用Array更好。由于List是一个接口,提供了许多特定的实现(如ArrayList、LinkedList等),这为客户代码和您带来了更多的灵活性。

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

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

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

如果方法getList()目前返回的是一个ArrayList,并且你想要改变它的行为,使其现在返回一个LinkedList,那么你可以这样做,而不必担心破坏使用你的方法的客户端代码,因为它只假定会收到一个List的实现,但不是任何特定的实现。

2

ArrayList 给我们提供了许多在简单数组中不可能实现的功能,我们必须编写大量的方法来完成 Arraylist 中可以一步完成的事情。所以除了内存消耗更高之外,还需要处理大量数据和性能问题时,如果可以使用简单数组就不要使用 ArrayList,因为简单数组运行速度更快。


2
  1. 如果可以使用List,那么避免使用数组是否合适?

    在一些情况下,您可能希望使用数组而不是列表。我建议您学习“大O符号”。此外,请记住,您可以使用列表并通过调用yourList.toArray(yourArray)方法将其转换为数组。您也可以使用Arrays类(Arrays.asList(yourArray))进行相反的操作。显然,使用List比使用数组更加灵活,但如果数据集很小,则使用数组可能比使用列表更有效率。

  2. 如果我用List替代数组,有什么需要考虑的内存问题吗?

    您需要牢记的最重要的内存考虑因素是内存分配。一旦创建了一个数组,您就无法增加或缩小它的大小。如果您需要一个对象数组(假设有100个项目),每个项目的大小为1M,直到该数组被垃圾回收,您就会为该对象(数组)分配100MB的内存。对于列表,如果您想要删除或添加项目,可以轻松地这样做,从而减少或增加列表的内存占用。


你能更具体地回答关于ArrayList的问题吗? - OrangeDog
@OrangeDog 你对哪些具体细节感兴趣? - hfontanez
如果您对更多的“大O符号”信息感兴趣,可以查看这个速查表 - hfontanez
什么样的数据集算是小型数据集?我手头有一个大约有200行的数据集,你认为它算是小型还是大型? - LuckMan
@LuckMan 我认为那很小。在网上搜索基准测试。 - hfontanez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接