List 实现

List 实现分为通用 List 实现和特殊用途的 List 实现。

通用 List 实现

有两个通用的 List 实现 ------ ArrayList 和 LinkedList。大多数时候,你可能会使用 ArrayList,它提供了按位置访问的功能并且速度比较快。当你需要同时移动多个元素的时候,可以充分发挥 System.arraycopy 的优势。可以将 ArrayList 看成是没有同步功能的 Vector。

如果你需要经常在 List 的头部添加元素或者遍历 List 并从内部删除元素,那么你可以考虑使用 LinkedList。这些操作在 LinkedList 中需要的是常数时间,而在 ArrayList 中却需要线性时间。不过你会付出性能上的代价,因为在 LinkedList 中按位置访问需要线性时间,而在 ArrayList 中只需要常数时间。如果你想使用 LinkedList,请在你做出决定前在你的系统中测试一下 LinkedList 和 ArrayList 的性能,通常情况下 ArrayList 更快。

ArrayList 有一个调整参数 ------ 容器初始值,它表示 ArrayList 在它的数据增长之前可以存放的元素个数。LinkedList 并没有调整参数,并且有 7 个可选的操作,其中一个是 clone。另外 6 个分别是, addFirst, getFirst, removeFirst, addLast, getLast, 和 removeLast。LinkedList 还实现了 Queue 接口。

特殊用途的 List 实现

CopyOnWriteArrayList 是实现了复制到数组进行备份的 List。这个实现非常像 CopyOnWriteArraySet。并不需要进行同步,即使在迭代期间,迭代器也会保证不会抛出 ConcurrentModificationException。这个实现很适合用于维护事件处理器列表,这个列表中的数据很少会改变,但是会频繁地进 行迭代和潜在的时间消耗。

如果你需要同步,那么 Vector 将会比使用 Collections.synchronizedList 创建的 ArrayList 略快。但是 Vector 会有一些遗留的操作,所以在使用 Vector 的时候请尽量使用 List 接口中的方法,或者你确定在以后不会更改 Vector 实现。

如果 List 的大小是固定的 ------ 也就是说,你不会调用 remove,add,或任何除了 containsAll 之外的批量操作 ------ 那么你还有第三个选择值得考虑一下。那就是 Arrays.asList,具体内容以后再讨论。

相关推荐
Queenie_Charlie5 小时前
前缀和的前缀和
数据结构·c++·树状数组
念越8 小时前
数据结构:栈堆
java·开发语言·数据结构
dear_bi_MyOnly9 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea
浪客灿心9 小时前
list_stack_queue
数据结构·list
zh_xuan9 小时前
最小跳跃次数
数据结构·算法
zh_xuan10 小时前
单青蛙跳台阶
数据结构·算法
罗湖老棍子10 小时前
【 例 1】石子合并(信息学奥赛一本通- P1569)
数据结构·算法·区间dp·区间动态规划·分割合并
小高Baby@11 小时前
JSON、bind、form
数据结构·json
数智工坊13 小时前
【数据结构-栈】3.1栈的顺序存储-链式存储
java·开发语言·数据结构
执着25914 小时前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode