我发现通过使用ArrayList
而不是在我的日常编码中使用数组,我几乎可以轻松地完成任何操作。
所以我在问:
ArrayList
代替吗?ArrayList
?答案 0 :(得分:7)
使用one over another绝对影响性能和效率,尽管它可能非常小。 JVM
的实施也影响很大。但是,从arrays
添加和提取条目总是比List
更快。如果您确定所需的array
大小,那么在使用时您可能也会节省很少的内存阵列。
但是,List
使您可以更灵活地修改内容,基本上有很多方法可以操作数据。它完全支持generics
。
由于数组是covariant
而泛型是invariant
,Arrays 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)
如果我可以使用List代替这种情况,是否适合避免使用数组。
在某些情况下,您可能希望在列表中使用数组。我建议你学习&#34; Big-O符号&#34;。此外,请记住,您可以使用列表并通过调用yourList.toArray(yourArray)
方法转换为数组。您也可以使用Arrays
类(Arrays.asList(yourArray)
)执行相反的操作。出于显而易见的原因,使用List
比使用数组更通用,但如果您的数据集很小,使用数组可能比列表更有效。
当我用List替换数组时,我需要考虑一些关于内存的事情(使用列表而不是数组)。
您需要记住的最重要的内存考虑因素是内存分配。创建阵列后,无法增大或缩小其大小。如果您需要一个大小为1M的对象数组(例如100个项),那么在该数组被垃圾收集之前,您将为该对象(数组)分配100MB。使用列表,如果要删除或添加项目,可以轻松完成;从而减少或增加列表的内存占用量。
答案 3 :(得分:1)
ArrayList为我们提供了许多在简单数组上无法实现的功能,我们必须在Arraylist中一步完成我们可以做的事情。 所以ArrayList比简单的Arrays需要更多的内存消耗,但你可以继续使用那些不会产生太大影响的小程序,但是当处理大量的数据和性能问题时,如果你可以使用简单的数组,就不要使用ArrayList作为数组更快。