Java集合源码解析之LinkedList

目录

1.ArrayList源码解析

[2.LinkedList 源码解析](#2.LinkedList 源码解析)

[为什么选择分析 LinkedList?](#为什么选择分析 LinkedList?)

适用场景

底层数据结构

流程图概览

核心方法解析

[添加元素(add 方法)](#添加元素(add 方法))

[删除元素(remove 方法)](#删除元素(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 可略过

java 复制代码
 /** 构建一个空的List */
    public LinkedList() {
    }

添加元素(add 方法)

java 复制代码
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 方法)

java 复制代码
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节点后,执行删除操作并返回true
                unlink(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方法比较元素值是否匹配,然后执行删除操作并返回true
                unlink(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源码解析

相关推荐
Knight_AL14 小时前
如何解决 Jacob 与 Tomcat 类加载问题:深入分析 Tomcat 类加载机制与 JVM 双亲委派机制
java·jvm·tomcat
枫叶丹414 小时前
【Qt开发】多元素类控件(二)-> QTableWidget
开发语言·qt
bin915314 小时前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
哲学七14 小时前
Springboot3.5.x版本引入javaCv相关库版本问题以及精简引入包
java·ffmpeg
Aqua Cheng.15 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
Nebula_g15 小时前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
努力努力再努力wz15 小时前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
励志不掉头发的内向程序员15 小时前
【STL库】哈希表的原理 | 哈希表模拟实现
开发语言·c++·学习·散列表
万粉变现经纪人15 小时前
如何解决 pip install -r requirements.txt 私有仓库认证失败 401 Unauthorized 问题
开发语言·python·scrapy·flask·beautifulsoup·pandas·pip