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

本文详细剖析了JavaLinkedList的底层数据结构,使用双链表实现,重点讲解了addlast和add方法的工作原理,以及首尾结点(first,last)与pre,next的区别。通过实例展示了如何在空集合中添加元素并跟踪节点变化。
摘要由CSDN通过智能技术生成

目录

先看一些重要的源码:

开始分析:


底层数据结构是双链表查询慢,首尾操作是极快的,所以多了很多首尾操作的特有 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++,集合操作次数加一

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

最后形成了这样的结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值