List实现
List
实现分为通用实现和专用实现。
通用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
接口。
专用List实现
CopyOnWriteArrayList是一个由写时复制数组备份的List
实现,此实现本质上类似于CopyOnWriteArraySet
。即使在迭代过程中也不需要同步,并且保证迭代器永远不会抛出ConcurrentModificationException
。此实现非常适合维护事件处理程序列表,在这些事件处理程序列表中更改很少,并且遍历频繁且可能很耗时。
如果需要同步,则Vector
会比用Collections.synchronizedList
同步的ArrayList
快一些。但是Vector有很多遗留操作,因此请务必始终使用List
接口操作Vector
,否则以后将无法替换实现。
如果你的List
大小固定 — 也就是说,你将永远不会使用remove
、add
或除containsAll
以外的任何批量操作 — 你肯定有第三种选择值得考虑,有关更多信息,请参见便利实现部分中的Arrays.asList
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。