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

相关推荐
ValhallaCoder4 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
月挽清风5 小时前
代码随想录第十五天
数据结构·算法·leetcode
NEXT066 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
小妖6669 小时前
js 实现快速排序算法
数据结构·算法·排序算法
独好紫罗兰12 小时前
对python的再认识-基于数据结构进行-a003-列表-排序
开发语言·数据结构·python
wuhen_n12 小时前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
2401_8414956412 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
独好紫罗兰12 小时前
对python的再认识-基于数据结构进行-a002-列表-列表推导式
开发语言·数据结构·python
2401_8414956412 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
数智工坊13 小时前
【数据结构-树与二叉树】4.5 线索二叉树
数据结构