0

可能重复:
什么是列表与 ArrayList?

两个都用过,就是想知道它们的优缺点是什么?主要区别是什么?哪个更好用?

谢谢。

4

4 回答 4

3

List实现的接口。另一个著名的实现是.ArrayList ListLinkedList

ArrayList提供恒定时间随机访问,同时LinkedList为非顺序访问提供恒定时间。当您声明一个将包含 的变量时ArrayList,请考虑通过接口访问它,如下所示:

List<ElementType> myList = new ArrayList<ElementType>();

这将使您可以在不干扰其余代码的情况下交换不同的实现。

于 2012-09-04T02:16:10.393 回答
2

List仅仅描述了作为一个列表意味着什么的契约。因此,它不是一个具体的实现,而仅仅是一个接口。可以通过多种方式实现列表。

特别是,您拥有ArrayList,它在内部保留了一个动态数组,用于按顺序存储所有元素。您还有LinkedList,它将元素存储为双向链表,即一系列节点,这些节点保留对前一个节点和下一个节点的引用。

Vector是另一个List,很像一个ArrayList,因为它的实现是基于一个动态数组;然而,它是旧版本 Java 的遗物,并且通过完全同步来保证线程安全。在实践中, new Vector<T>()或多或少等同于Collections.synchronizedList(new ArrayList<T>())

拥有 a 的原因List是列表可以通过多种方式实现。话虽如此,您通常希望拥有某种适用于所有Lists 的通用行为……参见polymorphism

于 2012-09-04T02:24:09.930 回答
1

List是一个接口ArrayList是该接口的实现。ArrayList 是一个 List,LinkedLists、Stacks、Vector 等也是。

于 2012-09-04T02:16:53.980 回答
1

其他海报已经回答了您问题的“什么”部分。在它们之间进行选择时需要考虑的一些因素。

ArrayList 在幕后使用数组。所以通过索引访问可以在恒定时间内完成。如果已为数组分配了足够的空间,则添加也可以在恒定时间内完成。但是,当空间用完时,ArrayList 会分配一个更大的数组并将旧数组值复制到新数组中。

LinkedList 使用链接在一起的节点。通过索引访问可能需要遍历整个列表(线性时间)。插入只需要创建一个新节点并在末尾添加它(如果维护尾指针,这可能是常数时间)。

因此,“哪个更好”可能取决于您如何使用它。老实说,我从未测量过两者之间的性能差异,但这只是需要考虑的问题。

于 2012-09-04T02:25:08.957 回答