我如何知道是使用数组还是数组列表?

Posted

技术标签:

【中文标题】我如何知道是使用数组还是数组列表?【英文标题】:How do I know whether to use an array or an arraylist? 【发布时间】:2014-09-11 16:59:39 【问题描述】:

什么决定了是否应该使用一个而不是另一个?

我曾经认为决定因素是您是否知道要存储的东西的大小,但我认为可能不止于此。

【问题讨论】:

Array or List in Java. Which is faster?的可能重复 我不是在寻找哪个更快。我正在寻找何时使用另一个,速度不是我确定的唯一因素 【参考方案1】:

当您知道集合的确切大小并且您不希望添加/删除元素时使用数组。

当您不知道集合的确切大小并且希望在某个时候对其进行更改时,请使用 List (ArrayList)。

如果您使用的是 Java8,则有 Stream API,它有助于在使用集合时显着减少样板代码。这是ArrayList(以及所有收藏和地图)的另一个优点。

更多信息:

Arrays vs ArrayList in performance

【讨论】:

如果我最初知道确切的尺寸但我希望它会改变怎么办? 然后使用ArrayList。数组具有特定的大小,如果您希望它改变,您需要预先初始化数组 感谢您的帮助。我还有一个问题/场景。假设我知道大小并且我知道它不会改变,是否还有理由(除了性能)使用 ArrayList 而不是数组? ArrayList 提供了多种方法,可以简化您使用集合的工作。特别是在 Java8 中,有所谓的 Stream API,它可以显着减少使用集合时的样板代码。【参考方案2】:

数组是固定的,ArrayList是可增长的。如果元素个数是固定的,使用数组 集合实现的一大好处是它们为您提供了很大的灵活性。因此,根据您的需要,您可以让 List 表现为 ArrayList 或 LinkedList 等。此外,如果您查看 Collection API,您会发现几乎所有您需要做的事情都有方法。

【讨论】:

【参考方案3】:

更多区别:

Java 中 Array 和 ArrayList 的第一个和主要区别在于 Array 是一个固定长度的数据结构,而 ArrayList 是一个variable length Collection 类。一旦在 Java 中创建,您就无法更改 Array 的长度,但 ArrayList 在满时会根据容量和负载因子重新调整大小。由于 ArrayList 在 Java 中由 Array 内部支持,因此 ArrayList 中的任何调整大小操作都会slow down performance,因为它涉及创建新数组并将内容从旧数组复制到新数组。

Java 中 Array 和 ArrayList 之间的另一个区别是,您不能将泛型与 Array 一起使用,因为 Array 实例知道它可以保存哪种类型并抛出 ArrayStoreException,如果您尝试存储类型不能转换为 Array 类型。 ArrayList 允许你使用Generics to ensure type-safety

ArrayList 和Array 的另一个主要区别是,您不能将primitives 存储在ArrayList 中,它只能包含对象。而 Array 在 Java 中可以同时包含原语和对象。尽管 Java 5 的 Autoboxing 可能会给您一种将基元存储在 ArrayList 中的印象,但它实际上会自动将基元转换为 Object。

Java 提供add() 方法将元素插入到 ArrayList 中,您可以简单地使用赋值运算符将元素存储到 Array 中,例如为了将Object存储到指定位置。

Array 与 ArrayList 的另一个区别是,您可以创建 ArrayList without specifying size 的实例,Java 将创建具有默认大小的 Array List,但在通过初始化 Array 直接或间接创建时必须提供 Array 的大小在创建它时。顺便说一下,你也可以在创建时初始化 ArrayList。

【讨论】:

【参考方案4】:

一般来说,我使用 ArrayList,而不是数组,因为它们提供了很多非常有用的方法。我认为如果性能非常重要,在非常特殊的情况下,您可以使用数组。

【讨论】:

您的建议很好,但推理可能有缺陷。 Arrays 也有几种有用的方法。 是的,没错,但是如果您必须调整列表的大小,使用数组会使事情变得复杂。此外,如果您必须公开您的阵列,则很难保护阵列访问。使用列表,您可以轻松地将其包装在不可变列表中(请参阅 Collections 类或 Guava 等价物)。【参考方案5】:

除非速度很关键(真的很关键,就像每一微秒都很重要),否则请尽可能使用ArrayList。它使用起来容易得多,而且这通常是需要考虑的最重要的事情。

【讨论】:

以上是关于我如何知道是使用数组还是数组列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用numpy查找数组中元素的索引? [复制]

如何将值添加到其他类的数组列表中?

如何判断数组列表中的元素是相同还是不同?

如何使用 pybind 传递 numpy 数组列表

如何使用 Pandas 保存 N x M 数组/列表?

如何使用 SWIG 将 C++ 数组转换为 Python 列表?