List Implementations

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

通用列表实现

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

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

ArrayList有一个调整参数-初始容量,它是ArrayList必须增 Long 之前可以容纳的元素数量。 LinkedList没有调整参数,并且有七个可选操作,其中之一是clone。其他六个是addFirstgetFirstremoveFirstaddLastgetLastremoveLastLinkedList还实现Queueinterface。

特殊 Object 清单的 Implementation

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

如果您需要同步,则Vector将比与Collections.synchronizedList同步的ArrayList快一些。但是Vector具有大量的传统操作,因此请务必始终使用Listinterface来操作Vector,否则以后将无法替换实现。

如果List的大小是固定的-也就是说,您永远不会使用removeaddcontainsAll以外的任何批量操作-您肯定有第三种选择值得考虑。有关更多信息,请参见Convenience Implementations部分中的Arrays.asList