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

时间:2014-12-23 17:24:54

标签: java performance arraylist

我发现通过使用ArrayList而不是在我的日常编码中使用数组,我几乎可以轻松地完成任何操作。 所以我在问:

  1. 如果我可以使用ArrayList代替吗?
  2. ,是否适合避免使用数组?
  3. 当我用ArrayList
  4. 替换数组时,是否需要考虑内存

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

总的来说,我认为在大多数情况下使用List over Array是一个更好的主意。由于减少了开销,阵列确实提供稍高的性能。但是,由于List是一个接口,因此有许多特定的实现可用(ArrayList,LinkedList等),它们为您提供了更多的灵活性。

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

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

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

如果方法getList()当前返回一个ArrayList,并且你想改变它的行为,现在它返回一个LinkedList,你就可以这样做而不用担心破坏使用你的方法的客户端代码,因为它是只是假设它将接收列表的某些实现,但不是任何特定的。

答案 2 :(得分:3)

  1. 如果我可以使用List代替这种情况,是否适合避免使用数组。

    在某些情况下,您可能希望在列表中使用数组。我建议你学习&#34; Big-O符号&#34;。此外,请记住,您可以使用列表并通过调用yourList.toArray(yourArray)方法转换为数组。您也可以使用Arrays类(Arrays.asList(yourArray))执行相反的操作。出于显而易见的原因,使用List比使用数组更通用,但如果您的数据集很小,使用数组可能比列表更有效。

  2. 当我用List替换数组时,我需要考虑一些关于内存的事情(使用列表而不是数组)。

    您需要记住的最重要的内存考虑因素是内存分配。创建阵列后,无法增大或缩小其大小。如果您需要一个大小为1M的对象数组(例如100个项),那么在该数组被垃圾收集之前,您将为该对象(数组)分配100MB。使用列表,如果要删除或添加项目,可以轻松完成;从而减少或增加列表的内存占用量。

答案 3 :(得分:1)

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