文档

Java™ 教程
隐藏目录
List 实现
路径: 集合
课程: 实现

列表实现

List实现被分为通用和特定目的的实现。

通用 List 实现

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

如果您经常在List的开头添加元素或在其内部迭代删除元素,您应该考虑使用LinkedList。这些操作在LinkedList中需要常数时间,在ArrayList中需要线性时间。但是性能方面会付出很大的代价。在LinkedList中,位置访问需要线性时间,在ArrayList中是常数时间。此外,LinkedList的常数因子要糟糕得多。如果您想使用LinkedList,在做出选择之前请使用LinkedListArrayList测量应用程序的性能;通常ArrayList更快。

ArrayList有一个调优参数 - 初始容量,它指的是ArrayList在扩容之前可以容纳的元素数量。而LinkedList没有调优参数,但有七个可选操作,其中之一是clone。其他六个操作分别是addFirstgetFirstremoveFirstaddLastgetLastremoveLastLinkedList还实现了Queue接口。

特定目的 List 实现

CopyOnWriteArrayList是由写入时复制数组支持的List实现。这个实现类似于CopyOnWriteArraySet。即使在迭代期间也不需要同步,迭代器保证不会抛出ConcurrentModificationException。这个实现非常适合维护事件处理器列表,其中变更不频繁,而遍历频繁且可能耗时。

如果需要同步,Vector比使用Collections.synchronizedList同步的ArrayList稍微快一些。但是Vector有很多遗留操作,所以务必始终使用List接口操作Vector,否则以后将无法替换实现。

如果您的List大小固定 - 即您永远不会使用removeadd或任何批量操作,除了containsAll - 则有第三个选择是绝对值得考虑的。有关更多信息,请参阅便利实现部分的Arrays.asList


上一页: 集合实现
下一页: 映射实现