java linklist add_LinkedList源码(add方法)

本文深入分析了Java中LinkedList的add方法源码,解释了其内部的双向链表结构以及如何通过add方法添加元素。通过示例展示了从LinkedList初始化到add操作的详细过程,包括Node类的结构以及在内存中的表示。分析指出,LinkedList在插入和删除操作上的高效,但在遍历和随机访问上的低效。
摘要由CSDN通过智能技术生成

对于要有扎实的java基础,集合是必须掌握的,而且精读这部分的源码很有用,也很有必要。而LinkedList是在java.util包下,和java.io,java.lang都是比较常用,而且比较简单。看看它们的源码有助于锻炼我们看源码的感觉,也了解一下大神们写代码的风格。看这些源码的目的,更多是为了增加阅读代码能力。

这里只写LinkedList的初始化和add()方法的源码分析,先放一张Collection集合的分类简图:

58505b68063947fb5863424a09068eab.png

LinkedList采用双向链表存储方式

3af159504070bbc11a8ed28f4f2a1992.png

缺点:遍历和随机访问元素效率低下。

优点:插入,删除元素效率比较高(但是前提也是必须先低效率查询才可,如果插入删除发生在头尾可以减少查询次数)。

那开始吧!

1 public classTestLinkedList {2

3 public static voidmain(String[] args) {4 LinkedList list = new LinkedList();5 list.add(1);6 list.add(2);7 list.add(3);8 }9 }

点进LinkedList发现只是一个构造函数,有3个变量(这里只放部分代码)

1 public class LinkedList

2 extends AbstractSequentialList

3 implements List, Deque, Cloneable, java.io.Serializable4 {5 transient int size = 0; //默认长度0

6 transient Node first; //上一个元素

7 transient Node last; //下一个元素

8

9 publicLinkedList() {10 }11

12 private static class Node{13 E item;14 Nodenext;15 Nodeprev;16

17 Node(Node prev, E element, Nodenext) {18 this.item =element;19 this.next =next;20 this.prev =prev;21 }22 }23

24

25 }

Node是LinkedList的一个内部类,Node指的是双向链表的结点(包括3部分,中间数据item,左右两边的指针,指向前prev后next的结点)

执行到LinkedList list = new LinkedList();在内存中是这样的

5dae589e4578bbd55efae2c0b1e2d275.png

我们再看看add()方法

1 public booleanadd(E e) {2 linkLast(e);3 return true;4 }5

6 /**

7 * Links e as last element.//将e链接为最后一个元素8 */

9 voidlinkLast(E e) {10 final Node l =last;11 final Node newNode = new Node<>(l, e, null);12 last =newNode;13 if (l == null)14 first =newNode;15 else

16 l.next =newNode;17 size++;18 modCount++;19 }

执行add(1)方法后,将开始last=null赋给了一个变量l,这时候new Node<>(l, e, null);就是new Node<>(null, 1, null),在栈里创建了对象(Node结点)。

b16ddd7ac8e3503037036e73c6a02201.png

到了12行last = newNode;last就不是null了,是0x2012,也就指向了下一个结点

306b2f1997bde8442b966f89199f3adc.png

在往后面看if判断,这是l是等于null的,就把first = newNode;first就不是null了,是0x2012(newCode),也就指向了上一个结点。因为只有一个结点,前后都是它自己。

a344d265c4b228b1d4ef67bb6f1d8340.png

继续add,l=0x2012,所以new Node<>(l, e, null);就是new Node<>(0x2012, 2, null),所以新增的结点就指向了上一个0x2012。

66cefaab6dd43c1a58832b3505cd056d.png

然后再last=newNode,就是0x3012。它就不执行0x2012了。

e763d85ec24c67c399fcae41baeb2225.png

这个时候if判断,l已经不等空了,执行l.next=newNode。newNode是0x3012,l是0x2012,l.next就是0x2012这个结点的next属性,也是个Node。

f0fcae25f2f1c1e4516a8749929c6394.png

内存图是这样的:

d436625bda7840e7298dec94e67d4238.png

最后再add

13c10d2b3ca925f533b5848f759f0c37.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值