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,具体内容以后再讨论。

相关推荐
草莓工作室25 分钟前
数据结构7:栈和队列
c语言·数据结构
小欣加油1 小时前
leetcode 143 重排链表
数据结构·c++·算法·leetcode·链表
Camel卡蒙1 小时前
数据结构——字典树Trie(介绍、Java实现)
java·数据结构
爱吃生蚝的于勒2 小时前
【Linux】深入理解进程(一)
java·linux·运维·服务器·数据结构·c++·蓝桥杯
猫梦www2 小时前
力扣21:合并两个有序链表
数据结构·算法·leetcode·链表·golang·力扣
草莓工作室2 小时前
数据结构8:栈
c语言·数据结构
Han.miracle2 小时前
数据结构——排序的学习(一)
java·数据结构·学习·算法·排序算法
晚枫~3 小时前
图论基础:探索节点与关系的复杂网络
网络·数据结构·图论
liu****4 小时前
20.哈希
开发语言·数据结构·c++·算法·哈希算法
一匹电信狗5 小时前
【LeetCode_160】相交链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl