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源码解析

相关推荐
Dream achiever11 分钟前
6.WPF控件---Label
开发语言·wpf
飞鱼&14 分钟前
RabbitMQ-高可用机制
java·rabbitmq·java-rabbitmq
zcyf080921 分钟前
rabbitmq分布式事务
java·spring boot·分布式·rabbitmq
程序员小假34 分钟前
我们来说一说动态代理
java·后端
360智汇云38 分钟前
k8s共享存储fuse-client三种运行方案对比
java·linux·开发语言
Rinleren42 分钟前
企业级 K8s 运维实战:集群搭建、微服务暴露(Ingress)、监控告警(Prometheus)全流程
java·容器·kubernetes
熙客1 小时前
Session与JWT安全对比
java·分布式·安全·web安全·spring cloud
先知后行。1 小时前
QT音视频
开发语言·qt·音视频
二向箔reverse1 小时前
人脸特征可视化进阶:用 dlib+OpenCV 绘制面部轮廓与器官凸包
开发语言·python