Java 中的 LinkedList 是一个非常实用的数据结构,它实现了 List 和 Deque(双端队列)接口,并且内部使用了双向链表来存储元素。这使得 LinkedList 在某些操作上比基于数组的 ArrayList 更加高效。下面是一些关于 LinkedList 需要关注的重要知识点:
1. 初始化
创建一个空的 LinkedList,创建一个包含初始元素的 LinkedList
LinkedList<String> list = new LinkedList<>();
LinkedList<String> list = new LinkedList<>(Arrays.asList("a", "b", "c"));
2. 底层数据结构
LinkedList 使用双向链表作为其底层数据结构。 每个节点包含三个部分:一个数据元素、一个指向下一个节点的引用以及一个指向前一个节点的引用。
3. 基本方法
添加元素
add(E e):向列表末尾添加一个元素。
addFirst(E e):将元素添加到列表的开头。
addLast(E e):将元素添加到列表的末尾。
删除元素
remove(Object o):从列表中移除第一次出现的指定元素。
removeFirst():移除并返回列表的第一个元素。
removeLast():移除并返回列表的最后一个元素。
获取元素
get(int index):返回指定位置的元素。
peekFirst():返回但不移除列表的第一个元素。
peekLast():返回但不移除列表的最后一个元素。
修改元素
set(int index, E element):将指定位置上的元素替换成新的元素。
其他方法
size():返回列表中的元素数量。
isEmpty():判断列表是否为空。
clear():清空列表中的所有元素。
contains(Object o):判断列表是否包含指定元素。
4. 遍历
LinkedList 支持多种遍历方式:
使用迭代器 Iterator
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
使用增强型 for 循环
for (String item : list) {
System.out.println(item);
}
使用 ListIterator
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
使用 forEach 方法
list.forEach(System.out::println);
5. 性能特点
插入和删除操作通常比 ArrayList 快,因为不需要移动元素。
查找操作比 ArrayList 慢,因为可能需要遍历整个列表。
不支持随机访问,因为访问特定索引的元素需要从头开始遍历。
6. 序列化
LinkedList 实现了 Serializable 接口,可以通过 writeObject 和 readObject 方法进行序列化和反序列化。
7. 与 Queue 接口的兼容性
LinkedList 实现了 Queue 接口,因此可以作为队列使用,支持 offer, poll, peek 等方法。
8. 线程安全性
LinkedList 不是线程安全的,如果多个线程同时访问一个 LinkedList 实例,必须手动同步访问。