Java 列表与阵列-何时使用什么?

Java 列表与阵列-何时使用什么?,java,collections,Java,Collections,我对Java比较陌生,多年来我不得不解决各种各样的编程问题,其中需要收集的数据数量对于程序员来说确实是未知的 当程序员无法知道需要收集的变量数量时,使用列表收集字符串或整数值是一种好的约定吗?或者在Java中使用动态数组有更好的方法来处理这个问题吗?如果您提前知道元素的大小,并且元素的类型相同,那么数组是最佳选择 否则,列表是使用的最佳选项 如果有疑问,使用列表可能是更好的选择,即使您知道长度 使用阵列可以提高性能,但您需要成为一名专家,才能知道什么时候这是一个好主意,什么时候这会使您的解决方案

我对Java比较陌生,多年来我不得不解决各种各样的编程问题,其中需要收集的数据数量对于程序员来说确实是未知的


当程序员无法知道需要收集的变量数量时,使用列表收集字符串或整数值是一种好的约定吗?或者在Java中使用动态数组有更好的方法来处理这个问题吗?

如果您提前知道元素的大小,并且元素的类型相同,那么数组是最佳选择


否则,列表是使用的最佳选项

如果有疑问,使用列表可能是更好的选择,即使您知道长度

使用阵列可以提高性能,但您需要成为一名专家,才能知道什么时候这是一个好主意,什么时候这会使您的解决方案更加复杂

顺便说一句:Java中没有动态数组。

列表(以及它们的近亲,Map和Set)对于几乎任何用例都是一个不错的选择。与数组相比,它们占用的内存稍多,增加的开销也较小,但提供了更丰富的API,并且通常使用接口编写的代码比使用静态类型数组编写的代码具有更好的可重用性/灵活性

java.util.Collections可能会增加不可接受的开销的一种情况是,您希望存储基本数据类型(如int、float等),因为要存储此类类型,需要使用包装器(集合类仅处理对象)。包装可以主要留给自动包装,但需要注意内存开销。apachecommons(可能还有其他库)还提供了直接使用原语的集合实现


只有在无法避免的情况下,才需要使用数组。

如果您唯一担心的是不知道需要多少元素,比如列表。通过动态数组,我假设您希望管理自己的数组并自己调整其大小?除非你想知道它是如何工作的,否则我不会白费力气的

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


看起来可能对你有用。

你做得对

List是一个接口,ArrayList是实现。如果你不太喜欢OO-mambo-jumbo,下面是你如何理解它的

列表是您想要处理“系统”的方式。你不太喜欢别的东西

但是“系统”可以通过多种方式自由实施它!ArrayList、LinkedList、Vector等


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

“那么阵列是最佳选择。”=>即使在这种情况下,也不一定。不一定<代码>列表具有丰富的功能,因为它是Collections API的一部分,所以我会在提前知道大小的情况下使用它。更不用说你不应该在一个
列表中混合类型
@assylias:不要忘记列表是由数组支持的。因此,始终要考虑性能开销。“丰富的功能”,我认为您也可以使用数组执行大多数列表操作。嗯,是否适用于这种情况,正如彼得所说,更多的是辩论/专业知识问题。@Nambari,你当然可以,但这不是重点。当它已经为
List
@Nambari实现时,我不想为array实现所有这些功能。是的,存在性能开销(这可能可以忽略,具体取决于您对列表/数组所做的操作)。然而,我认为在大小固定的地方使用数组而不是列表将属于“过早优化”类别。我并不是说数组没有用处。Java所称的
ArrayList
通常被称为动态数组。列表和ArrayList之间的区别是什么?它们在某种意义上都是动态的吗?@delnan,但事实并非如此。区别在于,当您使用列表时,您向任何拥有维护代码权限的人表明,此列表可以是任何列表。只有当ArrayList必须是ArrayList时,才应该使用它。如果在更一般的情况下将其具体化,以后就很难确定是否可以更改类型。这并不意味着它有一个共同的含义“Trove是一个优秀的原始集合库。以下是我对集合与对象数组这一一般问题的回答: