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