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

相关推荐
Fanxt_Ja6 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后1237 小时前
【数据结构】二叉树的概念
数据结构·二叉树
凯子坚持 c8 小时前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list
第七序章11 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
散11220 小时前
01数据结构-01背包问题
数据结构
消失的旧时光-194320 小时前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww21 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚1 天前
[数据结构] 排序
数据结构
睡不醒的kun1 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌1 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode