ArrayList与Array和List

时间:2015-08-02 15:37:24

标签: java arrays arraylist data-structures linked-list

我已经编程了很多,最近开始学习更多纯粹的计算机科学专题(面试)。

我知道Array和LinkedList数据结构之间的区别,但现在我已经开始使用Java了,我看到了这个ArrayList,我在构思时遇到了麻烦。

网络搜索只是真正向我展示了如何使用它们以及什么时候使用它们(各自的好处),但没有什么可以回答我的问题:

什么是ArrayList?我的假设是它是一个列表,它维护对每个元素的内存引用,使它也能像数组一样工作。

我也有一种感觉,因为Java是开放的,我应该能够看看Class定义,但是还没有想出如何做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:5)

ArrayList是一个由数组直接支持的列表。更具体地说,它由一个动态调整大小的数组支持。您可以在its source code中阅读更多相关信息;对它有一些很好的评论。

这很重要的原因是由于LinkedList的实现方式 - 作为传统的节点集合和对其他节点的引用。这会对索引和遍历产生性能影响,而对于ArrayList,由于它由数组支持,所以需要做的就是索引特定数组以检索值。

答案 1 :(得分:5)

我喜欢将它视为一种数据结构,让您享受这两个世界,快速访问索引,如数组和列表的无限增长。当然,总会有权衡。

ArrayList实际上是数组的包装器。每次数组的大小结束时,都会创建一个大小为两倍的新数组,并将原始数组中的所有数据复制到新数组中。

来自java doc:

  

List接口的可调整大小的数组实现。实现所有   可选的列表操作,并允许所有元素,包括null。在   除了实现List接口之外,这个类还提供了   操作内部使用的数组大小的方法   存储列表。 (这个类大致相当于Vector,除了   它是不同步的。) size,isEmpty,get,set,iterator和   listIterator操作以恒定时间运行添加操作运行   在摊销的常数时间内,即添加n个元素需要O(n)   时间即可。所有其他操作都以线性时间运行(粗略地说   请讲)。恒定因子与低的因子相比较低   LinkedList实现。

     

每个ArrayList实例都有一个容量。容量是大小   用于存储列表中元素的数组。它总是在   至少与列表大小一样大。随着元素被添加到   ArrayList,其容量自动增长。增长的细节   除了添加元素之外,没有指定策略   持续摊销的时间成本。

     

应用程序可以增加ArrayList实例的容量   在使用ensureCapacity添加大量元素之前   操作。这可能会减少增量重新分配的数量。

这允许 O(1)访问大多数操作,就像使用数组一样。偶尔,您需要使用插入操作来支付此性能,但需要更长时间。

这称为amortized复杂性。除了需要将数组大小加倍的那些时间外,每个操作只需要 O(1)。在那段时间你会支付 O(n),但如果你平均花费n次操作,平均花费的时间只有 O(1)而不是 O( n)的

让我们举个例子:

我们有一个100的数组(n = 100)。你做了100次插入操作(到不同的索引),每个操作只需要 O(1),当然所有的索引操作都采用 O(1)(因为这是一个数组)。在101插入时,阵列中的容量不再增加,因此ArrayList将创建一个新的数组,大小为200,将所有值复制到它( O(n)操作)然后插入第101项。在您将数组填充到200个项目之前,所有操作都将采用 O(1)