数组列表vs数组和列表



我一直在编程,最近开始学习更多纯粹的计算机科学主题(为了面试)。

我知道数组和LinkedList数据结构之间的区别,但现在我已经开始使用Java,我看到这个ArrayList,我有困难概念化。

网络搜索只真正告诉我如何使用它们以及何时使用它们(每种的好处),但没有什么能回答我的问题:

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

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

谢谢!

我喜欢把它想象成一种数据结构,它可以让您同时享受这两个世界:像数组那样快速访问索引和列表的无限增长。当然,总有取舍。

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

从java文档:

List接口的可调整数组实现。实现了所有可选列表操作,并允许所有元素,包括null。在除了实现List接口之外,这个类还提供方法来操作在内部使用的数组的大小存储列表。(这个类大致相当于Vector,除了 size, isEmpty, get, set, iterator, andlistIterator操作以常量时间运行。添加操作运行在平摊常数时间内,即添加n个元素需要O(n)时间。所有其他的操作都在线性时间内运行(大致为发言)。常数系数相对于LinkedList实现。

每个ArrayList实例都有一个容量。容量为的大小用于存储列表中元素的数组。它总是在至少和列表大小一样大。元素被添加到ArrayList,其容量会自动增长。增长的细节策略没有指定,除非添加元素具有常数平摊时间成本。

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

允许 0 (1)对大多数操作进行访问,就像对数组所做的那样。有时,您需要为这样的性能付出代价,但需要花费更长的插入操作。

这叫做平摊复杂度。每次操作只占用 0 (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)

ArrayList是由数组直接支持的列表。更具体地说,它由一个动态调整大小的数组支持。你可以在它的源代码中读到更多的信息;有一些很好的评论。

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

相关内容

  • 没有找到相关文章

最新更新