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