转载

Java™ 教程(List实现)

List实现

List 实现分为通用实现和专用实现。

通用List实现

有两种通用的 List 实现 — ArrayList 和 LinkedList ,在大多数情况下,你可能会使用 ArrayList ,它提供了恒定时间的位置访问,而且速度很快。它不必为 List 中的每个元素分配节点对象,并且当必须同时移动多个元素时,可以利用 System.arraycopy 的优势,将 ArrayList 视为 Vector ,而没有同步开销。

如果你经常将元素添加到 List 的开头或遍历 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

上一篇:Set实现

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