啃透JDK源码-LinkedList(中)

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

4.2 首位添加

addFirst(E e)

1.png

linkFirst(E e)

2.png图解首位添加

3.png

主要流程:

  • 将原 first 节点保存到 f
  • 将插入元素封装成 newNode,并且该新节点的next指向原来的头节点,即f
  • 若原来的头节点 f 为null,那么新插入头节点也是 last 尾节点,否则设置 f 的前置节点为NewNode,即 NewNode 现在是first 头节点.
  • size加一,修改计数器加一

4.3 指定位置插入

add(int index, E element)

4.png

首先调用checkPositionIndex检查index值是否在范围内

checkPositionIndex

aHR0cHM6Ly91cGxvYWRmaWxlcy5ub3djb2Rlci5jb20vaW1hZ2VzLzIwMjAwMzEwLzUwODg3NTVfMTU4MzgyMDk0NzU1N184Q0IwMkU1OTNENkVCNUM4Q0YzNTRGMjZBRUQwMkIwQg (1).png

isPositionIndex

  • 判断参数是否为迭代器或者添加操作的有效位置的索引.
  • 6.png
  • 如果index在最后的话,就调用在尾部插入的函数,否则调用LinkBefore

LinkBefore

1639378054(1).png

图解指定位置插入元素

7.png

5 remove

  • 因为 Deque 接口,所以本类也实现了如下方法支持双端操作:
  • 8.png

5.1 removeFirst()

9.png

unlinkFirst(Node f)

image.png

5.2 removeLast

image.png

unlinkLast

删除非空的尾节点

12.png

remove(int index)

在指定index删除

13.png

检验index是否合法.如果删除成功,返回删除的节点。 具体实现在unlink

image.png

图解 unlink 过程

14.png

流程如下:

  • 将删除的节点保存在element,同时把要删除节点的前驱节点标记为prev,后继节点标记为next
  • 若prev为null,则 next 节点直接为 first 节点,反之把prev的next指向next节点,如图上面弯曲的红色箭头
  • 若 next 为空,那么prev节点直接为last节点,反之把next的prev指向prev节点,如图下面弯曲的蓝色箭头
  • 把要删除的节点置空,返回第一步保存的element
目录
相关文章
|
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`成为构建高效多线程应用的强大工具。
82 2
|
9月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
89 0
|
10月前
|
设计模式 Java
根据JDK源码Calendar来看工厂模式和建造者模式
根据JDK源码Calendar来看工厂模式和建造者模式
124 3
|
10月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
92 0
|
10月前
|
Java Linux iOS开发
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
84 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(安装文件及脚本源码网盘分享)
135 0
|
10月前
|
算法 Java
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
Java【算法分享 01】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)
515 0