LinkedList的底层结构及相关介绍
基于jdk1.8 的源码分析(后续更新)
上图:
底层结构:双向链表
LinkedList中维护了两个重要的属性,first,和last,分别指向首节点和尾节点。每个节点(Node类型) 里面又维护了三个属性item、next、prev,分别指向当前元素、下一个元素、上一个元素、最终实现手拉手的结构!当然,和ArrayList一样,还LinkedList中还维护着size【用于记录大小】【modCount用于记录更新次数】
看看Node及其构造器:
空参和含参构造器
需要注意的是,含参构造器拿的是其父类的addAll方法。
linkFirst(E e)
- 这里提及first指针和last指针的注释:【指针条件】
(first == null && last == null) || (last.next == null && last.item != null) - 进入方法体,首先暂存first指针指向的Node节点【final】
- 初始化新的节点,prev域为空,next域为f
- first指针指向newNode
- 判断是否是第一个节点的添加:是:将last指针指向newNode,否:原头节点的prev域指向newNode
- 最后更新size【容量】和modCount【更新次数】
- 需要注意的是:此方法是用于设置头节点
linkLast(E e)
- 和设置首节点的逻辑相反
- 进入方法体:首先暂存last指针指向的节点
- 初始化新的节点,next域为空,prev域为链表的最后一个节点
- last指针指向新的节点
- 判断是否是第一次设置尾节点:是:将first指向新节点,否:原尾节点的next域指向newNode
- 最后更新size【容量】和modCount【更新次数】
- 需要注意的是:此方法是用于设置尾节点
对比ArrayList
底层结构 | 增删效率 | 改查效率 | |
---|---|---|---|
ArrayList | 可变数组 | 前面和中间的增删较低 | 较高 |
LinkedList | 双向链表 | 前面和中间的增删较高 | 较低 |