Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
List
实现分为通用和专用实现。
有两个通用的 List
实现 ArrayList
和 LinkedList
。大多数情况下,你可能会使用 ArrayList
,它提供了常量时间的位置访问,而且速度非常快。它不必为 List
中的每个元素分配节点对象,并且当它必须同时移动多个元素时,它可以利用 System.arraycopy
的优点。将 ArrayList
视为 Vector
而没有同步开销。
如果经常将元素添加到 List
的开头或迭代 List
以从其内部删除元素,则应考虑使用 LinkedList
。这些操作需要 LinkedList
中的常量时间和 ArrayList
中的线性时间。但是你的性能要付出很大的代价。位置访问需要 LinkedList
中的线性时间和 ArrayList
中的常量时间。此外,LinkedList
的常数因子要差得多。如果你认为要使用 LinkedList
,请在做出选择之前使用 LinkedList
和 ArrayList
来衡量应用程序的性能;ArrayList
通常更快。
ArrayList
有一个调整参数 initial capacity (初始容量),指的是 ArrayList
在必须增长之前可以容纳的元素数。LinkedList
没有调整参数,有七个可选操作,其中一个是 clone
。其他六个是 addFirst
,getFirst
,removeFirst
,addLast
,getLast
,以及 removeLast
。LinkedList
还实现了 Queue
接口。
CopyOnWriteArrayList
是由写时复制数组支持的 List
实现。此实现在本质上类似于 CopyOnWriteArraySet
。即使在迭代期间也不需要同步,并且保证迭代器永远不会抛出 ConcurrentModificationException
。此实现非常适合维护事件处理程序列表,其中更改很少发生,并且遍历频繁且可能耗时。
如果需要同步,Vector
将比用 Collections.synchronizedList
同步的 ArrayList
稍快。但是 Vector
有大量的遗留操作,所以要小心总是使用 List
接口操作 Vector
,否则你以后可能将无法替换实现。
如果你的 List
的大小是固定的 也就是说,你永远不会使用 remove
,add
,或 containsAll
以外的任何批量操作 你有第三个选择,绝对值得考虑。有关详细信息,请参阅 Convenience Implementations 部分中的 Arrays.asList
。