啃透JDK源码-LinkedList(上)

简介: 啃透JDK源码-LinkedList(上)

0 前言

与 ArrayList 一样实现了 List 接口,只是 LinkedList 底层结构为链表.在插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 稍逊.

其允许元素包括 null.除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

该类还实现了 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端).

1 继承体系

26.png

27.png

LinkedList 继承自 AbstractSequentialList,又实现了 List、Deque、Cloneable、Serializable等接口.

AbstractSequentialList相较于AbstractList(ArrayList的父类),只支持次序访问,而不支持随机访问,因为它的get(int index) ,set(int index, E element), add(int index, E element), remove(int index) 都是基于迭代器实现的。

Deque - 线性 collection,支持在两端插入和移除元素,定义了双端队列的操作.


2 属性

双向链表定义方式.


头节点的指针.不变性约束条件:(first == null && last == null) || (first.prev == null && first.item != null)

28.png

尾节点的指针.不变性约束条件:(first == null && last == null) || (last.next == null && last.item != null)

29.png

表示 LinkedList 的大小

30.png

节点Node

31.png

可以看出,这是一个典型的双向链表的结构

3 构造方法

3.1 无参

  • 构造一个空list
  • 33.png

3.2 有参

  • 构造一个包含指定 collection 中的元素的list,这些元素按其 collection 的迭代器返回的顺序排列。
  • 34.png
  • 下面开始看各大核心 API 细节.

4 add

4.1 末尾添加

add(E e)

  • 将指定元素添加到此 list 的末尾
  • 35.png
  • linkLast(E e)
  • 36.png
  • add(E e)等价于addLast(E e),因为 LinkedList 实现了 Deque 接口.
  • 37.png

addLast(E e)

38.png

核心都是linkLast方法.

  • 图解末尾添加
  • 39.png
目录
相关文章
|
10月前
|
安全 前端开发 Java
JDK源码级别彻底剖析JVM类加载机制
JDK源码级别彻底剖析JVM类加载机制
|
10月前
|
缓存 Dubbo Java
趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
|
7月前
|
算法 安全 Java
深入JDK源码:揭开ConcurrentHashMap底层结构的神秘面纱
【8月更文挑战第24天】`ConcurrentHashMap`是Java并发编程中不可或缺的线程安全哈希表实现。它通过精巧的锁机制和无锁算法显著提升了并发性能。本文首先介绍了早期版本中使用的“段”结构,每个段是一个带有独立锁的小型哈希表,能够减少线程间竞争并支持动态扩容以应对高并发场景。随后探讨了JDK 8的重大改进:取消段的概念,采用更细粒度的锁控制,并引入`Node`等内部类以及CAS操作,有效解决了哈希冲突并实现了高性能的并发访问。这些设计使得`ConcurrentHashMap`成为构建高效多线程应用的强大工具。
83 2
|
9月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
91 0
|
10月前
|
设计模式 Java
根据JDK源码Calendar来看工厂模式和建造者模式
根据JDK源码Calendar来看工厂模式和建造者模式
126 3
|
10月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
93 0
|
10月前
|
Java Linux iOS开发
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
88 0
|
10月前
|
Arthas 缓存 Java
[Jvm]程序员的精进之路~JDK代理源码初探
[Jvm]程序员的精进之路~JDK代理源码初探
|
10月前
|
消息中间件 Java Shell
Linux【脚本 03】shell脚本离线安装配置集结JDK+InfluxDB+Zookeeper+Kafka(安装文件及脚本源码网盘分享)
Linux【脚本 03】shell脚本离线安装配置集结JDK+InfluxDB+Zookeeper+Kafka(安装文件及脚本源码网盘分享)
139 0
|
10月前
|
算法 Java
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
525 0