文档

Java™ 教程-Java Tutorials 中文版
List 实现
Trail: Collections
Lesson: Implementations

List 实现

List 实现分为通用和专用实现。

通用 List 实现

有两个通用的 List 实现 — ArrayListLinkedList。大多数情况下,你可能会使用 ArrayList,它提供了常量时间的位置访问,而且速度非常快。它不必为 List 中的每个元素分配节点对象,并且当它必须同时移动多个元素时,它可以利用 System.arraycopy 的优点。将 ArrayList 视为 Vector 而没有同步开销。

如果经常将元素添加到 List 的开头或迭代 List 以从其内部删除元素,则应考虑使用 LinkedList。这些操作需要 LinkedList 中的常量时间和 ArrayList 中的线性时间。但是你的性能要付出很大的代价。位置访问需要 LinkedList 中的线性时间和 ArrayList 中的常量时间。此外,LinkedList 的常数因子要差得多。如果你认为要使用 LinkedList,请在做出选择之前使用 LinkedListArrayList 来衡量应用程序的性能;ArrayList 通常更快。

ArrayList 有一个调整参数 — initial capacity (初始容量),指的是 ArrayList 在必须增长之前可以容纳的元素数。LinkedList 没有调整参数,有七个可选操作,其中一个是 clone。其他六个是 addFirstgetFirstremoveFirstaddLastgetLast,以及 removeLastLinkedList 还实现了 Queue 接口。

专用 List 实现

CopyOnWriteArrayList是由写时复制数组支持的 List 实现。此实现在本质上类似于 CopyOnWriteArraySet。即使在迭代期间也不需要同步,并且保证迭代器永远不会抛出 ConcurrentModificationException。此实现非常适合维护事件处理程序列表,其中更改很少发生,并且遍历频繁且可能耗时。

如果需要同步,Vector 将比用 Collections.synchronizedList 同步的 ArrayList 稍快。但是 Vector 有大量的遗留操作,所以要小心总是使用 List 接口操作 Vector,否则你以后可能将无法替换实现。

如果你的 List 的大小是固定的 — 也就是说,你永远不会使用 removeadd,或 containsAll 以外的任何批量操作 — 你有第三个选择,绝对值得考虑。有关详细信息,请参阅 Convenience Implementations 部分中的 Arrays.asList


Previous page: Set Implementations
Next page: Map Implementations