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

目录

先看一些重要的源码:

开始分析:


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

JAVA_LinkedList添加元素源码分析(jdk17)_第1张图片

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


先看一些重要的源码:

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

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

prev:前一个结点的地址值

element:要存入的元素

next:后一个结点的地址值

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

JAVA_LinkedList添加元素源码分析(jdk17)_第2张图片

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


再来看看 LinkedList 的属性:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第3张图片


开始分析:

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

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

这两个要区别开来

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

JAVA_LinkedList添加元素源码分析(jdk17)_第4张图片

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

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

JAVA_LinkedList添加元素源码分析(jdk17)_第5张图片

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

JAVA_LinkedList添加元素源码分析(jdk17)_第6张图片

方法体第一行:

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

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

第二行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第7张图片

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

第三行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第8张图片

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

第四行进入 if:

JAVA_LinkedList添加元素源码分析(jdk17)_第9张图片

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

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

最后形成这样的结构

JAVA_LinkedList添加元素源码分析(jdk17)_第10张图片

最后 size++ ,长度为 1,

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

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

接着第二个

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

JAVA_LinkedList添加元素源码分析(jdk17)_第11张图片

第一行:

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

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

第二行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第12张图片

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

第三行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第13张图片

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

第六行 else:

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

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

最后 size++ ,长度为 2,

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

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

最后形成了这样的结构:

JAVA_LinkedList添加元素源码分析(jdk17)_第14张图片

添加第三个数据"ccc"

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

JAVA_LinkedList添加元素源码分析(jdk17)_第15张图片

第一行:

此时 last 是 0x0022

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

第二行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第16张图片

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

第三行:

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

JAVA_LinkedList添加元素源码分析(jdk17)_第17张图片

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

第六行 else:

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

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

最后 size++ ,长度为 3,

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

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

最后形成了这样的结构:

JAVA_LinkedList添加元素源码分析(jdk17)_第18张图片

你可能感兴趣的:(java,开发语言)