什么是 LinkedList
LinkedList
就像一个火车车厢队列。每个“车厢”里装着一个数据(元素),而且每个车厢都知道:自己前面是哪节车厢(previous
),自己后面是哪节车厢(next
),所以它是一种 “链式结构”。
- 不像
ArrayList
是一整块“连续的座位”(数组),LinkedList
是一个一个用链子连接的“车厢”。
LinkedList 的特点
- 有序的:按照你加入的顺序排好 >>> 比如你依次加入 A、B、C,顺序就是 A→B→C
- 可前后插入删除:在头尾都能插数据 >>> 比如
addFirst()
、addLast()
- 插入删除快:不用挪动所有元素,只改“链子”连接 >>> 删除 B,只要让 A→C 重新连上
- 查找慢:不能随机访问,要从头一个个找 >>> 要找第 10 个元素得从第 1 个开始走
- 支持克隆和序列化:可以复制、保存、网络传输 >>> 比如保存到文件或发送到别的机器
LinkedList 实现的接口
- List:是一个“有顺序的列表” >>> 像排好队的学生
- Deque:双端队列,可以从头尾操作 >>> 像一列火车头尾都能挂车厢
- Cloneable:能被克隆(复制)>>> 像拍照复制整列火车
- Serializable:能被序列化(写入文件或网络)>>> 像把火车打包存档再恢复
和 ArrayList 的区别(重点)
- 底层结构:ArrayList 是数组,而 LinkedList 是链表
- 查找速度:ArrayList 更快(O(1)),而 LinkedList 比较慢(O(n))
- 插入删除:ArrayList 比较慢(要挪动元素),而 LinkedList 更快(改链接)
- 是否支持双端操作:ArrayList 不支持,LinkedList 支持
- 适合场景:ArrayList 查得多改得少,LinkedList 改得多查得少
LinkedList 简单例子
LinkedList<String> list = new LinkedList<>();list.add("A");
list.add("B");
list.addFirst("Start"); //从头加
list.addLast("End"); //从尾加System.out.println(list);
// 输出:[Start, A, B, End]
LinkedList 总结
LinkedList
是一个能从两头插入或删除的“链式队列”,查找不快,但插入删除灵活,实现了 List
、Deque
、Cloneable
、Serializable
四个接口。
LinkedList 的四大接口解析
List 接口
- 有顺序的列表,你可以按位置访问元素。例如排队买奶茶,每个人都有自己的编号(位置),你可以直接喊:“请第 3 个人出来!”
- 关键点:
- 保留顺序
- 可以按索引访问、添加、删除
- 典型方法:
get(index)
, add(index, element)
, remove(index)
Deque 接口
- 双端队列(Double-Ended Queue),可以从两端操作。例如火车车厢既可以从火车头挂车厢,也可以从火车尾挂车厢。
- 关键点:
- 可以在头尾添加或删除元素
- 常用方法:
addFirst()
, addLast()
, removeFirst()
, removeLast()
, peekFirst()
, peekLast()
Cloneable 接口
- 可克隆,能复制自己。
- 关键点:
- 可以做一个一模一样的
LinkedList
副本
- 关键方法:
clone()
(浅拷贝,只复制元素引用,不复制元素本身)
Serializable 接口
- 可序列化,能被“存档”或“传输”。比如把火车拆成零件打包寄给朋友,朋友再把它组装起来还是原来的火车。
- 关键点:
- 存入文件、数据库,或通过网络发送
- 实现
Serializable
的对象可以用 ObjectOutputStream
写入文件,用 ObjectInputStream
读取回来
四大接口总结
- List:排队买奶茶 >>> 有顺序,按位置操作元素
- Deque:火车两端加车厢 >>> 双端插入/删除元素
- Cloneable:镜子里的复制品 >>> 可以克隆(浅拷贝)
- Serializable:拆火车打包寄 >>> 可以序列化保存或传输