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 双向链表 线程不同步、不安全 增删效率搞、查询效率低
相关推荐
程序员阿鹏5 分钟前
jdbc批量插入数据到MySQL
java·开发语言·数据库·mysql·intellij-idea
莲动渔舟6 分钟前
国产编辑器EverEdit - 在编辑器中对文本进行排序
java·开发语言·编辑器
martian66541 分钟前
【Java高级篇】——第16篇:高性能Java应用优化与调优
java·开发语言·jvm
m0_7482500343 分钟前
springboot使用logback自定义日志
java·spring boot·logback
-优势在我1 小时前
Android TabLayout 实现随意控制item之间的间距
android·java·ui
Lojarro1 小时前
JavaEE基础之- Servlet相关
java·servlet·java-ee
考虑考虑1 小时前
MyCat2使用
java·后端·java ee
KingDol_MIni1 小时前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
许苑向上1 小时前
Java八股文(下)
java·开发语言
逸Y 仙X2 小时前
Git常见命令--助力开发
java·大数据·git·java-ee·github·idea