列表 vs 数组 - 什么时候使用哪一个?

5
我对Java比较新,多年来我必须解决各种编程问题,其中需要收集的数据量是程序员无法预知的。
当程序员无法知道需要收集的变量数量时,使用列表来收集字符串或整数值是一个好习惯吗?还是在Java中使用动态数组处理这个问题更好?

这是我对集合与对象数组的一般问题的回答:https://dev59.com/e2025IYBdhLWcg3wST6Q#6105705 - Kevin Bourrillion
5个回答

8

如果有疑问,即使你知道长度,使用 List 可能是更好的选择。

使用数组可能会更快,但你需要成为专家才能知道何时这样做是一个好主意,何时它只会让你的解决方案更加复杂。

顺便说一下:在 Java 中不存在动态数组。


1
Java中所谓的ArrayList通常被称为动态数组。 - user395760
List和ArrayList有什么区别?它们不都是动态的吗? - AnchovyLegend
这并不意味着它有一个通用的含义 https://www.google.co.uk/search?q=java+"dynamic+array" - Peter Lawrey
维基百科指出,“C++的std::vector是动态数组的一种实现,Java API和.NET Framework提供的ArrayList[12]类也是如此。” ;) - Peter Lawrey
@PeterLawrey 我从未声称Java的人使用这个术语,我只是不知道他们是否使用。然而,许多其他人确实使用这个术语(在不提到Java的情况下搜索“动态数组”),并且他们的定义与Java的ArrayList相匹配。 - user395760
显示剩余4条评论

1

你做得很好。

List是一个接口,而ArrayList是它的实现。如果你不太关心面向对象的废话,那么这里有一个简单的理解方式。

List是你想要处理“系统”的方式。你不太关心其他任何事情。

但是,“系统”有自由选择多种实现方式!ArrayList、LinkedList、Vector等。

一旦你理解了这种分离,那么就可以尝试了解这些实现之间的差异和细微差别。


0
列表(以及它们的近亲Map和Set)几乎适用于任何用例。与数组相比,它们会消耗更多的内存并增加一些开销,但提供了一个更丰富的API,并且通常针对接口编写的代码比使用静态类型数组的代码更具可重用性/灵活性。
当您想要存储原始数据类型(例如int、float等)时,java.util.Collections可能会添加不可接受的开销,因为要存储这些类型,您需要使用包装器(集合类仅处理对象)。包装大多可以留给自动装箱,但需要注意内存开销。Apache commons(以及可能其他库)还提供直接使用原语的集合实现。
只有在无法避免时才使用数组。

Trove是一个优秀的原始集合库。 - Erick Robertson

0

如果你唯一担心的是不知道需要多少元素,可以使用类似列表的东西。我假设你想要通过动态数组来管理自己的数组并调整其大小?除非你想学习它的原理,否则我不建议浪费这样的精力。

Java的好处在于List是一个接口,具有不同的实现(如ArrayList、LinkedList、Stack、Vector),取决于您的需求。

看起来ArrayList可能适合你。


-1
如果您提前知道元素的大小并且元素类型相同,则数组是最佳选择。
否则,列表是最好的选择。

不一定,即使在那种情况下也不是最好的选择。 - assylias
不一定。由于List是集合API的一部分,因此具有丰富的功能,因此在我预先知道大小的情况下,我会在这种情况下使用它。更不用说您不应该在List中混合类型。 - obataku
@assylias:不要忘记列表是由数组支持的。因此,总会有性能开销。“丰富的功能”,我认为你也可以用数组完成大部分列表操作。嗯,这在这种情况下是否适用,更多的是一个争论/专业问题,正如Peter所说的那样。 - kosa
@Nambari 当然你可以,但这不是重点。当已经为“List”实现时,我不想为数组实现所有内容。 - obataku
1
@Nambari 是的,存在性能开销(取决于您对列表/数组执行的操作可能是可以忽略不计的)。但是我认为,在尺寸固定的情况下,到处使用数组而不是列表会属于“过早优化”的范畴。我并不是说数组没有用处。 - assylias
虽然我有点同意你的观点,但这更关乎“你如何使用它”,而这个辩论永远不会结束。 - kosa

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