JAVA_LinkedList添加元素源码分析(jdk17)

目录

先看一些重要的源码:

开始分析:


底层数据结构是双链表查询慢,首尾操作是极快的,所以多了很多首尾操作的特有 Api:

addlast 和 add 一样元素默认添加到末尾,了解即可。


先看一些重要的源码:

1.首先找到 LinkedList-->Alt+7 看大纲 --> 找到内部类 Node:

可以看到这里的构造方法的参数分别是:

prev:前一个结点的地址值

element:要存入的元素

next:后一个结点的地址值

这个一定要记住,下面会用到

发现和双向链表的结构完全一样。


再来看看 LinkedList 的属性:

注意这里的 first 和 last 不能看作是前后结点,他们指的是首尾结点


开始分析:

为了不弄混,再次说明以下:

  • pre 和 next 表示前后结点地址值
  • first 和 last 表示首尾结点地址值

这两个要区别开来

假设我们使用空参创建了一个 LinkedList 集合,这时在堆内存中会创建一个集合,此时首尾结点为 null:

这时要分别添加元素"aaa" "bbb" "ccc"

1.首先会调用add 方法接收参数,

然后在方法内调用了一个 LinkLast 方法

方法体第一行:

因为此时集合内还没有元素,所以 last 为 null

--------------------------------------------------------

第二行:

然后 new 了一个结点,地址值为 0x0011,数值为"aaa",前后结点地址值都为 null

-----------------------------------------------------------

第三行:

并且把这个新结点的地址值赋值给尾结点(last),所以说现在 last 就只指向了刚刚创建的这个结点

---------------------------------------------------------

第四行进入 if:

并且让这个新结点作为首结点(first)

注意:因为此时只有一个结点,所以它既是首又是尾结点

最后形成这样的结构

最后 size++ ,长度为 1,

modCount++,集合操作次数加一

目前第一个元素添加完毕。

接着第二个

一开始代码和第一次一样,会在 add 方法中调用 LinkLast 方法,如下

第一行:

这时 Last 就不是 null 了,是刚刚那个结点的地址值 0x0011.

--------------------------------------------------------------

第二行:

然后 new 了一个结点,数值为"bbb",前结点地址值为 0x0011,后结点地址值为 null。

----------------------------------------------------------------

第三行:

并且把这个新结点的地址值赋值给尾结点(last),所以说现在 last 就只指向了刚刚创建的这个结点。

---------------------------------------------------------

第六行 else:

0x0011 的 next(下一个) 结点地址 为 0x0022

--------------------------------------------------------

最后 size++ ,长度为 2,

modCount++,集合操作次数加一

--------------------------------------------

最后形成了这样的结构:

添加第三个数据"ccc"

前面一样:在 add 方法中调用 LinkLast 方法:

第一行:

此时 last 是 0x0022

------------------------------------------------

第二行:

然后 new 了一个结点,数值为"ccc",前结点地址值为 0x0022,后结点地址值为 null。

--------------------------------------------------

第三行:

并且把这个新结点的地址值赋值给尾结点(last),所以说现在 last 就只指向了刚刚创建的这个结点。

------------------------------------------------

第六行 else:

0x0022 的 next(下一个) 结点地址 为 0x0033

---------------------------------------

最后 size++ ,长度为 3,

modCount++,集合操作次数加一

----------------------------------------------

最后形成了这样的结构:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/244463.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3源码(二)reactiveeffect

一.reactive与effect功能 reactive方法会将对象变成proxy对象&#xff0c; effect中使用reactive对象时会进行依赖收集&#xff0c;稍后属性变化时会重新执行effect函数。 <div id"app"></div><script type"module">import {reactive,…

web开发学习笔记(14.mybatis基于xml配置)

1.基本介绍 2.基本使用 在mapper中定义 在xml中定义&#xff0c;id为方法名&#xff0c;resultType为实体类的路径 在测试类中写 3. 动态sql&#xff0c;if和where关键字 动态sql添加<where>关键字可以自动产生where和过滤and或者or关键字 where关键字可以动态生成whe…

C++面试:跳表

目录 跳表介绍 跳表的特点&#xff1a; 跳表的应用场景&#xff1a; C 代码示例&#xff1a; 跳表的特性 跳表示例 总结 跳表&#xff08;Skip List&#xff09;是一种支持快速搜索、插入和删除的数据结构&#xff0c;具有相对简单的实现和较高的查询性能。下面是跳表…

常用芯片学习——HC244芯片

HC573 三态输出八路缓冲器|线路驱动器 使用说明 SNx4HC244 八路缓冲器和线路驱动器专门设计用于提高三态存储器地址驱动器、时钟驱动器以及总线导向接收器和发送器的性能和密度。SNx4HC244 器件配备两个具有独立输出使能 (OE) 输入的 4 位缓冲器和驱动器。当 OE 为低电平时&a…

【AI视野·今日NLP 自然语言处理论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 11 Jan 2024 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Leveraging Print Debugging to Improve Code Generation in Large Language Models Authors Xueyu Hu, Kun K…

php基础学习之代码框架

一&#xff0c;标记 脚本标记&#xff08;已弃用&#xff09;&#xff1a;<script language"php"> php代码 </script> 标准标记&#xff1a;<?php php代码 ?> 二&#xff0c;基础输出语句 不是函数&#xff0c;…

行业分析|中国人工智能发展的优势与差距

​人工智能&#xff0c;被誉为第四次工业革命的催化剂&#xff0c;吸引着发达国家和众多科技公司大举投入研发。我国积极构筑人工智能发展的先发优势&#xff0c;党的二十大报告提出推动战略性新兴产业集群&#xff0c;构建一系列新的增长引擎&#xff0c;包括信息技术、人工智…

QT发送request请求

时间记录&#xff1a;2024/1/23 一、使用步骤 &#xff08;1&#xff09;pro文件中添加network模块 &#xff08;2&#xff09;创建QNetworkAccessManager网络管理类对象 &#xff08;3&#xff09;创建QNetworkRequest网络请求对象&#xff0c;使用setUrl方法设置请求url&am…

MySQL 8.3 发布, 它带来哪些新变化?

1月16号 MySQL 官方发布 8.3 创新版 和 8.0.36 长期支持版本 (该版本 没有新增功能&#xff0c;更多是修复bug )&#xff0c;本文基于 官方文档 说一下 8.3 版本带来的变化。 一 增加的特性 1.1 GTID_NEXT 支持增加 TAG 选项。 之前的版本中 GTID_NEXTUUID:number &#xff…

scrapy框架核心知识Spider,Middleware,Item Pipeline,scrapy项目创建与启动,Scrapy-redis与分布式

scrapy项目创建与启动 创建项目 在你的工作目录下直接使用命令: scrapy startproject scrapytutorial运行后创建了一个名为scrapytutorial的爬虫工程 创建spider 在爬虫工程文件内&#xff0c;运行以下命令&#xff1a; scrapy genspider quotes创建了名为quotes的爬虫 …

超融合系统疑难故障定位与解决实践 3 例(含信创技术栈)

当 IT 系统出现故障&#xff0c;问题定位往往是运维人员最头疼的环节。尤其是超融合系统&#xff0c;由于整体涉及的技术栈比较复杂&#xff0c;且有越来越多的用户基于信创环境进行部署&#xff0c;非常考验厂商和技术人员的专业能力&#xff1a;厂商研发和售后工程师不仅应能…

【C/C++】C/C++编程——C++ 开发环境搭建

C的开发环境种类繁多&#xff0c;以下是一些常见的C 集成开发环境&#xff1a; AppCode &#xff1a;构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C&#xff0c;C,C&#xff0c;Java和Java开发的集成开发环境CLion&#xff1a;来自JetBrains的跨平台的C/C的集成开…

天津大数据培训班推荐,数据分析过程的常见错误

大数据”是近年来IT行业的热词&#xff0c;目前已经广泛应用在各个行业。大数据&#xff0c;又称海量信息&#xff0c;特点是数据量大、种类多、实时性强、数据蕴藏的价值大。大数据是对大量、动态、能持续的数据&#xff0c;通过运用分析、挖掘和整理&#xff0c;实现数据信息…

keil5 查看stm32 寄存器的值

1 查看芯片内部寄存器的值&#xff0c;首先是在仿真状态下&#xff0c;首先仿真&#xff0c;程序运行。 2 点击菜单栏的 View -> System viewer &#xff0c;右侧便会出现芯片的所有寄存器(如果没有&#xff0c;需要添加)&#xff0c;点击要查看的寄存器&#xff0c;便会出…

ARM安装与项目结构

1. 安装环境 参考E:\peixunQianrushi\arm\ziliao\FS4412新版&#xff08;学生资料&#xff09;\环境相关资料 这边建议全部默认路径 安装注意事项&#xff1a; 1、在接下来的安装过程中&#xff0c;对于使用win10、win8的操作系统的用户&#xff0c;所有的安装请均以管理员身份…

014-信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

014-信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ爬虫&插件项目 #知识点&#xff1a; 1、JS前端架构-识别&分析 2、JS前端架构-开发框架分析 3、JS前端架构-打包器分析 4、JS前端架构-提取&FUZZ 解决&#xff1a; 1、如何从表现中的JS提取…

pytorch(二)梯度下降算法

文章目录 优化问题梯度下降随机梯度下降 在线性模型训练的时候&#xff0c;一开始并不知道w的最优值是什么&#xff0c;可以使用一个随机值来作为w的初始值&#xff0c;使用一定的算法来对w进行更新 优化问题 寻找使得目标函数最优的权重组合的问题就是优化问题 梯度下降 通…

Canvas-Editor 实现类似 Word 协同编辑

前言 对于word的协同编辑&#xff0c;已经构思很久了&#xff0c;但是没有找到合适的插件。今天推荐基于canvas/svg 的富文本编辑器 canvas-editor&#xff0c;能实现类似word的基础功能&#xff0c;如果后续有更好的&#xff0c;也会及时更新。 Canvas-Editor 效果图 官方文…

终极解决Flutter项目运行ios项目报错Without CocoaPods, plugins will not work on iOS or macOS.

前言 最近在开发Flutter项目&#xff0c;运行ios环境的时候报错没有CocoaPods&#xff0c;安卓环境可以正常运行&#xff0c;当时一脸懵逼&#xff0c;网上搜索了一下&#xff0c;有给我讲原理的&#xff0c;还有让我安装这插件那插件的&#xff0c;最终把电脑搞得卡死&#x…

【spring】代码生成器

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;spring ⛺️稳中求进&#xff0c;晒太阳 代码生成器&#xff08;本质IO流&#xff09; 在mybatis的逆向工程生成model和mapper接口和xml文件后&#xff0c;还需要反复的写Service的接口和…