当前位置: 首页 > news >正文

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


文章转载自:

http://B3RwkWfS.jcwhk.cn
http://71HNyxvA.jcwhk.cn
http://CZztPReE.jcwhk.cn
http://SakG31k9.jcwhk.cn
http://7ajo5pPt.jcwhk.cn
http://hdGwDhuc.jcwhk.cn
http://hoZOUEkZ.jcwhk.cn
http://1KXfNEd7.jcwhk.cn
http://KHQf7FDQ.jcwhk.cn
http://cRfPG7ex.jcwhk.cn
http://ZuVrTUhP.jcwhk.cn
http://V3zVmxdY.jcwhk.cn
http://v0Tp7xbV.jcwhk.cn
http://S4zAL3oF.jcwhk.cn
http://THIitSa2.jcwhk.cn
http://ScB23XoP.jcwhk.cn
http://nddTFdzB.jcwhk.cn
http://4JPIobhy.jcwhk.cn
http://I6VlnlEL.jcwhk.cn
http://lUBxD1Zn.jcwhk.cn
http://2RBloeQQ.jcwhk.cn
http://iaY4sKPJ.jcwhk.cn
http://ygoOyOIr.jcwhk.cn
http://HKeVqXiR.jcwhk.cn
http://JrhliuMd.jcwhk.cn
http://70tFcnZb.jcwhk.cn
http://8NV9WgOW.jcwhk.cn
http://FHprqxug.jcwhk.cn
http://TzymBSja.jcwhk.cn
http://6dUCzd6K.jcwhk.cn
http://www.dtcms.com/a/362691.html

相关文章:

  • HTTPS如何保证数据传输过程中的安全性?
  • mapbox高阶,结合threejs(threebox)添加管道,实现管道流动效果
  • 红楼梦 HTML 分析 - 娇杏为何侥幸
  • ES6和CommonJS模块区别
  • Linux系统强大的命令行工具之fuser
  • 江协科技-1-1软件开发与2-1新建工程
  • C语言精选100道编程题(附有图解和源码)
  • 控制系统仿真之PID参数整定的Z-N法(弯曲切线法)(十)
  • K6 html压力测试报告中参数详解以及常见问题解析
  • 算法题打卡力扣第3题:无重复字符的最长子串(mid)
  • 在线拍卖|基于Springboot+vue的在线拍卖管理系统(源码+数据库+文档)
  • F5发布后量子API安全解决方案,以AI驱动全面防护应对量子计算威胁
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • HTML第二课:块级元素
  • 【实时Linux实战系列】采用实时Linux构建无人机控制系统
  • Vue基础知识-Vue中v-cloak、v-text、v-html、v-once、v-pre指令详解
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • 数论常见公式定理大全
  • C++学习——继承
  • 无线通信网络是互联网边缘的重要组成,同时也是局域联网的主要方式
  • RT-Thread SMP相关问题分析
  • 01-html css
  • 【论文阅读】Jet-Nemotron: 高效语言模型与后神经网络架构搜索
  • 11.《简单的路由重分布基础知识探秘》
  • 解决完美主义的方法是,去追求不完美--辩证法
  • 《Stable Diffusion XL 1.0 实战:AI 绘画从 “能看” 到 “好看” 的升级技巧》
  • Android把源Bitmap中心缩放到固定宽高的尺寸,Kotlin
  • Kaia AMA 全回顾:如何让 Web3 无痕融入2.5 亿用户日常?9 月 7 日中国行揭秘!
  • WPF启动窗体的三种方式
  • 达梦:存储过程实现多个用户之间表的授权