List Implementations
List
实现分为通用实现和专用实现。
通用列表实现
有两个通用的List实现— ArrayList和LinkedList。在大多数情况下,您可能会使用ArrayList
,它提供了恒定时间的位置访问,并且速度很快。它不必为List
中的每个元素分配节点对象,并且当必须同时移动多个元素时可以利用System.arraycopy
的优势。将ArrayList
视为Vector
,而没有同步开销。
如果您经常在List
的开头添加元素或在List
上进行迭代以从其内部删除元素,则应考虑使用LinkedList
。这些操作需要LinkedList
中的恒定时间和ArrayList
中的线性时间。但是您要付出巨大的性能代价。位置访问需要LinkedList
中的线性时间和ArrayList
中的恒定时间。此外,LinkedList
的恒定因子要差得多。如果您认为要使用LinkedList
,请在选择之前同时使用LinkedList
和ArrayList
来评估应用程序的性能; ArrayList
通常更快。
ArrayList
有一个调整参数-初始容量,它是ArrayList
必须增 Long 之前可以容纳的元素数量。 LinkedList
没有调整参数,并且有七个可选操作,其中之一是clone
。其他六个是addFirst
,getFirst
,removeFirst
,addLast
,getLast
和removeLast
。 LinkedList
还实现Queue
interface。
特殊 Object 清单的 Implementation
CopyOnWriteArrayList是由写时复制数组备份的List
实现。此实现本质上与CopyOnWriteArraySet
类似。即使在迭代过程中也不需要同步,并且保证迭代器永远不会抛出ConcurrentModificationException
。此实现非常适合维护事件处理程序列表,在这些事件处理程序列表中更改很少,并且遍历频繁且可能很耗时。
如果您需要同步,则Vector
将比与Collections.synchronizedList
同步的ArrayList
快一些。但是Vector
具有大量的传统操作,因此请务必始终使用List
interface来操作Vector
,否则以后将无法替换实现。
如果List
的大小是固定的-也就是说,您永远不会使用remove
,add
或containsAll
以外的任何批量操作-您肯定有第三种选择值得考虑。有关更多信息,请参见Convenience Implementations部分中的Arrays.asList
。