【发布时间】:2012-08-28 16:05:42
【问题描述】:
【问题讨论】:
【问题讨论】:
List 是一个由ArrayList class 实现的接口。 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>())。
拥有List 的原因是列表可以通过多种方式实现。话虽如此,您通常希望拥有某种适用于所有Lists 的通用行为...参见polymorphism。
【讨论】:
List 是interface,ArrayList 是该接口的实现。 ArrayList 是 List,LinkedLists、Stacks、Vector 等也是。
【讨论】:
其他发帖人已经回答了您问题的“什么”部分。在它们之间进行选择时需要考虑一些注意事项。
ArrayList 在后台使用数组。所以按索引访问可以在恒定时间内完成。如果已为数组分配了足够的空间,则添加也可以在恒定时间内完成。但是,当空间用完时,ArrayList 会分配一个更大的数组,并将旧的数组值复制到新的数组中。
LinkedList 使用链接在一起的节点。通过索引访问可能需要遍历整个列表(线性时间)。插入只需要创建一个新节点并将其添加到末尾(如果保留了尾指针,这可能是常数时间)。
所以“哪个更好”取决于您如何使用它。老实说,我从未测量过两者之间的性能差异,但这只是需要考虑的问题。
【讨论】: