# 列表实现

> 原文： [https://docs.oracle.com/javase/tutorial/collections/implementations/list.html](https://docs.oracle.com/javase/tutorial/collections/implementations/list.html)

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

## 通用列表实现

有两种通用 [`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`而没有同步开销。

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

`ArrayList`有一个调整参数 - _ 初始容量 _，它指的是`ArrayList`在必须增长之前可以容纳的元素数量。 `LinkedList`没有调整参数和七个可选操作，其中一个是`clone`。其他六个是`addFirst`，`getFirst`，`removeFirst`，`addLast`，`getLast`和`removeLast`。 `LinkedList`也实现了`Queue`接口。

## 专用列表实现

[`CopyOnWriteArrayList`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) 是由写时复制阵列备份的`List`实现。该实现在本质上类似于`CopyOnWriteArraySet`。即使在迭代期间也不需要同步，并且保证迭代器永远不会抛出`ConcurrentModificationException`。此实现非常适合维护事件处理程序列表，其中更改很少发生，并且遍历频繁且可能耗时。

如果需要同步，`Vector`将比`Collections.synchronizedList`同步的`ArrayList`略快。但`Vector`有大量遗留操作，因此请务必使用`List`接口操作`Vector`，否则您将无法在以后更换实现。

如果您的`List`大小固定 - 也就是说，您永远不会使用`remove`，`add`或`containsAll`以外的任何批量操作 - 您有第三个选项，绝对值得考虑。有关详细信息，请参阅[便捷性实现](convenience.html)部分中的`Arrays.asList`。