这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中更新的语言功能的概述。
请参阅JDK发布说明,了解有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
List
实现被分为通用和特定目的的实现。
有两个通用的List
实现 - ArrayList
和LinkedList
。大多数情况下,你可能会使用ArrayList
,它提供了常数时间的位置访问并且非常快速。它不需要为List
中的每个元素分配节点对象,并且可以在需要同时移动多个元素时利用System.arraycopy
。将ArrayList
视为没有同步开销的Vector
。
如果您经常在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
。