java linkedlist源码_java中LinkedList源码分析

ArrayList是动态数组,其实本质就是对数组的操作。

那么LinkedList实现原理和ArrayList是完全不一样的。

现在就来分析一下ArrayList和LinkeList的优劣吧

LinkedList是一个双向链表,每个元素都是一个Node对象,

这个node对象里面有三个成员:

E item;指向实际的元素

Node next;指向下一个节点

Node prev;指向前一个结点

964cce9d8aae8a39e4f835277809477f.png

利用idea编辑器查看LinkedList的结构,发现只有三个成员变量。

9d45caeb000079b59bfd6d62d14ceb88.png

而所有的public方法操作的都是这个三个变量。

下面逐个分析方法。

543bb847d849119d4570305ee8fd7428.png

主要就是调用了linkLast方法。

8ada3ced996e34162990dbf732898095.png

步骤如下:

第一步:l指向尾节点,

第二步:创建新的节点newNode;因为是在链表的最后添加元素,所以新节点的next元素为null.

第三步:尾节点指向新的节点

第四步:如果l(之前的尾节点)为空,新节点当作第一个节点

第五步:如果l(之前的尾节点)不为空,则之前的尾节点的next变量指向新节点。

链表大小size++;

修改的次数modCount++;

List list=new LinkedList<>();

list.add("a");

list.add("b");

1db8c19f4372d7372effbaaced442d42.png

与ArrayList不同,LinkedList内存是按需分配的,不需要提前分配内存空间,因为操作的不是数组。

get方法

5ab8e14a689ac0b684d212ad8badacc5.png

checkElementIndex(index);主要用于检查参数是否符合规范,没什么好说的。

主要看node(index)方法。

72df88e0b760cee5704a79286f671228.png

index>1)表示index小于size/2;

如果index索引位于前半部分,从头开始根据next向后遍历;

一直找到index-1索引处

如果在后半部分从last处开始根据prev向前遍历。一直循环到index处。

ArrayList中数组是连续存放的,可以根据索引直接定位元素,而LinkedList中,必须从头或尾顺着链接查找,所以论查询效率LinkedList没有ArrayList效率高;但是在链表前或尾添加和删除的效率倒是比ArrayList要高。

LinkedList还提供了remove,add(int index,E element),indexOf(Object o)等等这些方法,基本上都是差不多的原理操作的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值