列表实现
原文: https://docs.oracle.com/javase/tutorial/collections/implementations/list.html
List
实现分为通用和专用实现。
通用列表实现
有两种通用 List
实现 - ArrayList
和 LinkedList
。大多数情况下,您可能会使用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
是由写时复制阵列备份的List
实现。该实现在本质上类似于CopyOnWriteArraySet
。即使在迭代期间也不需要同步,并且保证迭代器永远不会抛出ConcurrentModificationException
。此实现非常适合维护事件处理器列表,其中更改很少发生,并且遍历频繁且可能耗时。
如果需要同步,Vector
将比Collections.synchronizedList
同步的ArrayList
略快。但Vector
有大量遗留操作,因此请务必使用List
接口操作Vector
,否则您将无法在以后更换实现。
如果您的List
大小固定 - 也就是说,您永远不会使用remove
,add
或containsAll
以外的任何批量操作 - 您有第三个选项,绝对值得考虑。有关详细信息,请参阅便捷性实现部分中的Arrays.asList
。