转载

Java™ 教程(List实现)

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 。

上一篇:Set实现

原文  https://segmentfault.com/a/1190000020764658
正文到此结束
Loading...