可能重复:
什么是列表与 ArrayList?
两个都用过,就是想知道它们的优缺点是什么?主要区别是什么?哪个更好用?
谢谢。
List
是类实现的接口。另一个著名的实现是.ArrayList
List
LinkedList
ArrayList
提供恒定时间随机访问,同时LinkedList
为非顺序访问提供恒定时间。当您声明一个将包含 的变量时ArrayList
,请考虑通过接口访问它,如下所示:
List<ElementType> myList = new ArrayList<ElementType>();
这将使您可以在不干扰其余代码的情况下交换不同的实现。
List
仅仅描述了作为一个列表意味着什么的契约。因此,它不是一个具体的实现,而仅仅是一个接口。可以通过多种方式实现列表。
特别是,您拥有ArrayList
,它在内部保留了一个动态数组,用于按顺序存储所有元素。您还有LinkedList
,它将元素存储为双向链表,即一系列节点,这些节点保留对前一个节点和下一个节点的引用。
Vector
是另一个List
,很像一个ArrayList
,因为它的实现是基于一个动态数组;然而,它是旧版本 Java 的遗物,并且通过完全同步来保证线程安全。在实践中, new Vector<T>()
或多或少等同于Collections.synchronizedList(new ArrayList<T>())
。
拥有 a 的原因List
是列表可以通过多种方式实现。话虽如此,您通常希望拥有某种适用于所有List
s 的通用行为……参见polymorphism。
List是一个接口,而ArrayList是该接口的实现。ArrayList 是一个 List,LinkedLists、Stacks、Vector 等也是。
其他海报已经回答了您问题的“什么”部分。在它们之间进行选择时需要考虑的一些因素。
ArrayList 在幕后使用数组。所以通过索引访问可以在恒定时间内完成。如果已为数组分配了足够的空间,则添加也可以在恒定时间内完成。但是,当空间用完时,ArrayList 会分配一个更大的数组并将旧数组值复制到新数组中。
LinkedList 使用链接在一起的节点。通过索引访问可能需要遍历整个列表(线性时间)。插入只需要创建一个新节点并在末尾添加它(如果维护尾指针,这可能是常数时间)。
因此,“哪个更好”可能取决于您如何使用它。老实说,我从未测量过两者之间的性能差异,但这只是需要考虑的问题。