Java集合源码解析之LinkedList
目录
1.ArrayList源码解析
2.LinkedList 源码解析
为什么选择分析 LinkedList?
适用场景
底层数据结构
流程图概览
核心方法解析
添加元素(add 方法)
删除元素(remove 方法)
3.HashMap源码解析****※
1.ArrayList源码解析
2.LinkedList 源码解析
在Java集合框架(Java Collections Framework, JCF)中,LinkedList 是一个常用的数据结构,它基于双向链表(Doubly Linked List)实现,适用于频繁的插入、删除操作。相较于ArrayList,LinkedList具有不同的性能特性和适用场景。因此,本文将深入分析 LinkedList 的实现原理、数据结构及其核心方法的源码,以帮助开发者更好地理解其底层逻辑。
为什么选择分析 LinkedList?
不同于 ArrayList,适合插入删除操作。ArrayList 依赖于动态数组存储元素,当插入或删除元素时,需要移动大量元素,而 LinkedList 采用双向链表结构,插入和删除操作仅需调整指针,时间复杂度为 O(1)(在已知节点的情况下)。
适用场景
频繁插入、删除元素(如队列、栈等结构)。 不关心随机访问性能(LinkedList 随机访问的时间复杂度为 O(n))。 在 Deque(双端队列)或 Queue 场景下,如 LinkedList 实现了 Deque 接口,可用于双端队列操作。
底层数据结构
- ArrayList:基于动态数组实现,底层是一个 Object[] 数组,元素按索引存储,支持随机访问。
- LinkedList:基于双向链表实现,每个元素(节点)包含数据和前后指针,存储在非连续的内存空间。
流程图概览
核心方法解析
构造方法只是构建一个空的List 可略过
/** 构建一个空的List */public LinkedList() {}
添加元素(add 方法)
public boolean add(E e) {linkLast(e); // 使用 linkLast 方法添加到链表末尾return true;
}void linkLast(E e) {final Entry<E> l = last; // 获取当前最后一个节点final Entry<E> newNode = new Entry<>(e, null, l); // 创建新节点,next设为null,prev设为最后一个节点last = newNode; // 更新最后一个节点为新节点if (l == null) // 如果原来链表为空,则第一个节点也是新节点first = newNode;else // 如果链表非空,则将原最后一个节点的next指向新节点l.next = newNode;size++; // 增加链表大小计数器
}
删除元素(remove 方法)
public boolean remove(Object o) {if (o == null) { // 如果要删除的元素为null,需要遍历查找null节点for (Entry<E> x = first; x != null; x = x.next) { // 从头到尾遍历链表if (x.element == null) { // 找到null节点后,执行删除操作并返回trueunlink(x); // 执行删除操作(unlink方法)return true;}}} else { // 如果要删除的元素不为null,可以直接使用remove(Object)重载方法(基于equals比较)for (Entry<E> x = first; x != null; x = x.next) { // 从头到尾遍历链表,找到匹配的元素并删除(如果存在)if (o.equals(x.element)) { // 使用equals方法比较元素值是否匹配,然后执行删除操作并返回trueunlink(x); // 执行删除操作(unlink方法)return true;}}}return false; // 如果找不到匹配的元素,返回false表示删除失败。
}E unlink(Entry<E> x) { // 从链表中删除指定节点x并返回其元素值。注意这里不检查x是否为null,因为调用者已经保证了x不为null。final E element = x.element; // 获取要删除的节点元素值。注意这里不直接返回x.element,因为在某些情况下(如双向链表),可能需要额外的操作。但在这个简化版本中,我们直接返回。在双向链表中,还需更新前驱和后继节点的链接。这里为了简洁,省略了这部分代码。在实际的实现中
3.HashMap源码解析****※
下一篇将对HashMap源码进行解析(最重要)
HashMap源码解析