列表实现

原文: https://docs.oracle.com/javase/tutorial/collections/implementations/list.html

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

通用列表实现

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

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

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

专用列表实现

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

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

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