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

通用List实现

  1. 有两个通用的 [`List`](https://docs.oracle.com/javase/8/docs/api/java/util/List.html)实现- [`ArrayList`](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html)和 [`LinkedList`](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html)。在大多数情况下,您可能会使用`ArrayList`,它提供了恒定时间的位置访问,而且速度很快。它不必为`List`中的每个元素分配一个节点对象,并且必须同时移动多个元素时,可以利用`System.arraycopy`。将`ArrayList`作为`Vector`,没有同步开销。<br /> 如果您经常在`List`的开头添加元素或在`List`上进行迭代以从其内部删除元素,则应考虑使用`LinkedList`。这些操作需要`LinkedList`中的恒定时间和`ArrayList`中的线性时间。但是您要付出巨大的性能代价。位置访问需要使用`LinkedList`的线性时间和`ArrayList`的恒定时间。此外,`LinkedList`的恒定因素要差得多。如果你觉得你想使用`LinkedList`,请在选择之前同时使用`LinkedList`和`ArrayList`评估应用程序的性能; `ArrayList`通常更快。<br />`ArrayList`有一个调整参数- _初始容量_,它是指在`ArrayList`增长之前可以容纳的元素数。`LinkedList`没有调整参数,并且有七个可选操作,其中之一是`clone`。另外六个是`addFirst`,`getFirst`,`removeFirst`,`addLast`,`getLast`,和`removeLast`。`LinkedList`还实现了`Queue`接口。

专用List实现

CopyOnWriteArrayListList写时复制数组备份的实现。此实现本质上类似于CopyOnWriteArraySet。即使在迭代过程中也不需要同步,并且保证迭代器永远不会抛出异常ConcurrentModificationException。此实现非常适合维护事件处理程序列表,在这些事件处理程序列表中更改很少,并且遍历频繁且可能很耗时。
如果您需要同步,则Vector将比用Collections.synchronizedList同步的ArrayList稍快。但是Vector有大量的旧操作,因此请务必始终使用List接口来操作Vector,否则以后将无法替换实现。
如果您的List大小是固定的——也就是说,您将永远不会使用removeadd或除containsAll外的其他任何批量操作——您肯定有第三种选择值得考虑。有关Arrays.asList更多信息,请参见“ Convenience接口的实现”部分。