本文共 981 字,大约阅读时间需要 3 分钟。
列表实现分为通用和特殊用途的实现。
有两个通用的列表实现——ArrayList和LinkedList。大多数情况下,您可能会使用ArrayList,它提供了常量时间的位置访问,而且非常快。它不需要为列表中的每个元素分配一个节点对象,它可以利用系统。arraycopy必须同时移动多个元素。将ArrayList看作是没有同步开销的矢量。
如果您经常在列表的开头添加元素,或者在列表中迭代,从其内部删除元素,那么您应该考虑使用LinkedList。这些操作需要在一个链表和一个ArrayList中的线性时间中常量时间。但是你在性能上付出了巨大的代价。位置访问在一个链表中需要线性时间,而在ArrayList中则需要常量时间。此外,LinkedList的常数因子更糟糕。如果你认为你想使用LinkedList,在做出选择之前,用LinkedList和ArrayList来衡量你的应用程序的性能;ArrayList通常更快。
ArrayList有一个调优参数——初始容量,它指的是ArrayList在必须增长之前可以容纳的元素的数量。LinkedList没有调优参数和7个可选操作,其中一个是克隆。另外六个是addFirst, getFirst, removeFirst, addLast, getLast,和removeLast。LinkedList也实现了队列接口。
CopyOnWriteArrayList是一个由copy-on-write数组支持的列表实现。这个实现在性质上与CopyOnWriteArraySet类似。没有同步是必要的,即使在迭代,迭代器保证永远不会抛出ConcurrentModificationException。这个实现非常适合于维护事件处理程序列表,在这个列表中更改不频繁,并且遍历是频繁且可能耗费时间的。
如果你需要同步,一个向量将略高于一个ArrayList Collections.synchronizedList同步。但是Vector有大量的遗留操作,所以要小心使用列表接口来操作向量,否则您将无法在稍后的时间内替换实现。
如果您的列表是固定大小的——也就是说,您永远不会使用删除、添加或任何其他的批量操作——您有第三个选择,绝对值得考虑。可以查看, asList的实现部分获取更多信息。
转载地址:http://feqab.baihongyu.com/