前言
本文分享链表与 LinkedList 的内容。结构类似,若有顺序表基础会更容易理解。我们从集合框架出发。
一、Java 集合框架
- Java 集合框架是 Java 中用于存储和操作一组对象的体系,核心分为 Collection(单列集合)和 Map(双列集合)
核心接口与分类
- Collection(单列集合)
- 是所有单列集合的根接口,定义了集合的基本操作(增删改查、遍历等)。
- 子接口:List(有序可重复)、Set(无序不可重复)、Queue(队列)。
- Map(双列集合)
- 存储键值对(Key-Value),Key 唯一、Value 可重复。
- 子接口:SortedMap(键有序)。
LinkedList
- 实现的接口
- 实现了 List 接口(具备列表的增删改查能力);
- 实现了 Deque 接口(同时具备双端队列的特性,可作为栈、队列使用)。
- 核心特性
- 结构:基于双向链表,每个节点存储前驱、后继节点的引用,无容量限制;
- 访问效率:随机访问(通过索引 get(i))效率低(时间复杂度 O(n)),需遍历链表;
- 增删效率:在链表两端 / 已知节点附近增删元素效率高(时间复杂度 O(1));
- 线程不安全:多线程环境下需手动同步。
List 接口
这是 LinkedList 作为列表的核心接口,它继承自 Collection 接口,定义了有序集合的基础行为。
- 核心约定:
元素有序可重复,支持通过索引访问如
get(int index)、set(int index, E element); 支持增删改查的全量列表操作,例如add(E e)、remove(int index)、contains(Object o)等。 - 对 LinkedList 的影响: LinkedList 必须实现索引相关的方法,但由于其底层是双向链表,索引访问需要遍历链表(时间复杂度 O(n)),这也是它和 ArrayList(数组实现,索引访问 O(1))的核心区别。
Deque 接口
这是 LinkedList 区别于 ArrayList 的关键接口,它继承自 Queue 接口(Queue 又继承自 Collection),是双端队列的核心接口。
- 核心约定:
允许在队列两端进行元素的插入、删除和获取操作,同时兼容队列和栈的行为:
队列行为:遵循先进先出(FIFO),如
offer(E e)(队尾入队)、poll()(队首出队); 双端操作:支持队首 / 队尾双向操作,如addFirst(E e)(队首添加)、addLast(E e)(队尾添加)、getFirst()(获取队首)、getLast()(获取队尾); 栈行为:遵循后进先出(LIFO),可通过push(E e)(等效于 addFirst,入栈)、pop()(等效于 removeFirst,出栈)实现栈功能。 - 对 LinkedList 的影响: 由于 LinkedList 是双向链表,天然支持首尾节点的 O(1) 时间复杂度操作,因此它是 Deque 接口的最优实现之一。
Cloneable 接口
- 这是一个标记接口(无任何方法),用于表示该类的实例可以通过 clone() 方法实现浅拷贝。
- 对 LinkedList 的影响: LinkedList 重写了 clone() 方法,调用后会创建一个新的 LinkedList 实例,新实例中的节点是新对象,但节点存储的元素是原对象的引用(即浅拷贝),若元素是可变对象,修改原对象会影响拷贝对象。
Serializable 接口
- 同样是标记接口,用于表示类的实例可以进行序列化(将对象转化为字节流)和反序列化(字节流恢复为对象)。


