LinkedList源码解读

这里写目录标题

简介

LinkedList 是对 Java 集合框架中 List 接口的一种具体实现,归属于线性数据结构的范畴。其核心内部结构是通过双向链表(double-linked list)来实现的,这使得它在元素插入、删除操作上具备较高的效率,尤其是在列表的首尾进行操作时。

相较于数组实现的列表,如 ArrayList,LinkedList 在非索引访问或遍历操作上可能效率较低。

LinkedList 类继承自 AbstractList 抽象类,并且实现了 List 接口以及标记接口 Serializable。通过实现 Serializable 接口,ArrayList 集合的实例能够支持序列化过程,从而允许对象的状态被转换成可以存储或传输的形式,用于网络传输或保存到文件等。


源码解读

基础变量

java 复制代码
// 记录元素个数
transient int size = 0;

// 当前节点的前一个结点
transient Node<E> first;

// 当前节点的后一个结点
transient Node<E> last;

// 初始化结点
private static class Node<E> {
	E item;
	Node<E> next;
	Node<E> prev;

	Node(Node<E> prev, E element, Node<E> next) {
		this.item = element;
		this.next = next;
		this.prev = prev;
	}
}

构造函数

LinkedList()

构造一个空链表。

java 复制代码
public LinkedList() {}
LinkedList(Collection<? extends E> c)

传入一个 Collection 的子类集合,将元素存储到 LinkedList。

java 复制代码
public LinkedList(Collection<? extends E> c) {
	this();
	addAll(c);
}
  1. addAll©
java 复制代码
public boolean addAll(Collection<? extends E> c) {
	// size:链表长度,这里作为开始添加新元素的位置
	return addAll(size, c);
}
  1. addAll(size, c)
java 复制代码
public boolean addAll(int index, Collection<? extends E> c) {
	// 判断 index 是否超出范围(index >= 0 && index <= size)
	checkPositionIndex(index);

	// 将集合转为数组
	Object[] a = c.toArray();
	int numNew = a.length;    // 数组长度
	if (numNew == 0)
		return false;

	// 初始化前结点、后结点
	Node<E> pred, succ;
	// 如果index == size,说明实在链表的末尾添加,后继节点为null,前驱节点为最后一个节点
	if (index == size) {
		succ = null;
		pred = last;
	} else {
		// 否则,找到指定索引位置的节点,作为后继节点,并找到其前驱节点
		succ = node(index);
		pred = succ.prev;
	}

	 // 遍历数组a,将每个元素添加到链表中
	for (Object o : a) {
		@SuppressWarnings("unchecked") E e = (E) o;

		// 创建新节点,前驱为pred,元素为e,后继为null(暂时)
		Node<E> newNode = new Node<>(pred, e, null);
		// 如果前驱节点为null,说明新节点是第一个节点
		if (pred == null)
			first = newNode;
		// 否则,将新节点链接到前驱节点的后面
		else
			pred.next = newNode;
		pred = newNode;
	}

	// 如果后继节点为null,说明是在链表末尾添加,更新最后一个节点为pred
	if (succ == null) {
		last = pred;
	} 
	// 否则,将新添加的最后一个节点链接到原来的后继节点
	else {
		pred.next = succ;
		succ.prev = pred;
	}

	// 更新链表的大小
	size += numNew;
	modCount++;  // 修改次数
	return true;
}

总结

数据结构 底层结构 线程安全 执行效率
ArrayList 可变数组 Object[] elementData 线程不同步、不安全 查询效率搞、增删效率低
LinkedList 双向链表 线程不同步、不安全 增删效率搞、查询效率低
相关推荐
zquwei7 分钟前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
TT哇14 分钟前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
火烧屁屁啦36 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_31234541 小时前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安1 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA1 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S2 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos2 小时前
C++----------函数的调用机制
java·c++·算法