LinkedList 实现原理及源码解析(jdk8 底层⽤的是链表)
LinkList顾名思义,就是通过链表实现的集合,优点就是插入、删除速度快,但遍历速度不及ArrayList,本质原因还是数据结构的不同,至于ListList和ArrayList的优缺点网上很多,这里不再赘述。
前言
LinkList源码其实不难,主要关注三个重要的方法和Node内部类:
- 将新添加的元素e作为链表的最后一个元素并维护进去
linkLast(E e)
- 从链表中删除x节点的链接
unlink(Node<E> x)
- 根据传入的index值,返回对应的节点node
node(int index)
- 私有内部静态类Node
class Node
源码分析
/*** 将新添加的元素e作为链表的最后一个元素并维护进去*/void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)// 如果是第一个添加的元素,则first指向该节点{first = newNode;} else// 如果不是第一个添加进来的元素,则更新l的后置节点指向新添加的元素节点{l.next = newNode;}size++;modCount++;}
基本没什么特别的算法,就是链表操作而已
/*** 从链表中删除x节点的链接*/E unlink(Node<E> x) {// assert x != null;final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;// x.prev为null,表示x节点为第一个元素if (prev == null) {// 更新first节点为x的后置节点first = next;} else {// 将x的前置节点于x的后置节点相连接prev.next = next;// 断开x的前置指针x.prev = null;}// x.next为null,说明x节点为最后一个元素if (next == null) {// 将最后一个节点更新为x的前置节点last = prev;} else {// 将x的后置节点与x的前置节点相连接next.prev = prev;// 断开x的后置指针x.next = null;}x.item = null;size--;modCount++;return element;}
删除一个节点会对前置节点、后置节点进行判断,然后将前后节点进行连接,要删除的节点进行置空即可
接下来看下node方法,相当于ArrayList中的get方法
/*** Returns the (non-null) Node at the specified element index.** 根据传入的index值,返回对应的节点node*/Node<E> node(int index) {// assert isElementIndex(index);// 如果index小于总长度size的一半,则从头开始向后遍历寻找if (index < (size >> 1)) {// x等于首节点Node<E> x = first;for (int i = 0; i < index; i++) {// 从first节点开始查找,直到index下标node才返回nodex = x.next;}return x;}// 从尾部开始向前遍历查找else {// x等于最后一个节点Node<E> x = last;// 向前查找,直到遍历到index下标的node后才返回for (int i = size - 1; i > index; i--) {// x的前一个节点x = x.prev;}return x;}}
这里会判断是属于链表的前半部分还是后半部分,如果是前半部分,则从头开始遍历直到遍历到index下标;如果是后半部分,则从后向前遍历,直到遍历到index下标
最后我们看下Node类的基本结构,也就是链表的元素结构
/*** Node 元素结构* @param <E>*/private static class Node<E> {// 节点元素E item;// 后置节点指针Node<E> next;// 前置节点指针Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}
很简单,就是中间存元素,前后存相映节点的指针,我们可以通过一张图来做个全局的理解
总结
LinkList要比ArrayList、HashMap简单的多,底层采用的数据结构也不复杂,大家看图示就能够比较好的理解add、remove等操作
如果喜欢我的文章记得一定要
一键三连
哟(别下次一定!!!)
LinkedList 实现原理及源码解析(jdk8 底层⽤的是链表)相关推荐
- HashMap 实现原理及源码解析(jdk8 底层⽤的是数组+链表/红⿊树)
本文会通过HashMap中的put方法为入口,进行源码解读,文章较长,需要耐心阅读 说明 /** */: 代表注释,区别于例子注释 egx::代表例子注释 解读前须知 源码主要关注4⼤点: 确定哈希桶 ...
- ArrayList 实现原理及源码解析(jdk8 底层⽤的是数组)
本文会主要从集合扩容.添加元素.删除元素三个方面来进行源码解读 在开始解读之前,我们先来看一下ArrayList添加一个元素的流程 基本在图中已经比较全面的说明了add一个元素的全流程 源码解读 我们 ...
- 【特征匹配】ORB原理与源码解析
相关 : Fast原理与源码解析 Brief描述子原理与源码解析 Harris原理与源码解析 http://blog.csdn.net/luoshixian099/article/details/48 ...
- Redis进阶- Redisson分布式锁实现原理及源码解析
文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...
- PCA-SIFT原理及源码解析
相关: SIFT原理与源码解析 SURF原理与源码解析 ORB原理与源码解析 FAST原理与源码解析 BRIEF描述子原理与源码解析 Harris原理与源码解析 转载请注明出处:http://blog ...
- Spring Boot 核心原理与源码解析 - 目录
准备重新写 SpringBoot 配置文件解析原理 , 先在这里把要写的内容记下来 Spring Boot 核心原理与源码解析 - 目录 1\何时解析\如何解析 application.propert ...
- 【特征匹配】BRIEF特征描述子原理及源码解析
相关:Fast原理及源码解析 Harris原理及源码解析 SIFT原理及源码解析 SURF原理及源码解析 转载请注明出处: http://blog.csdn.net/luoshixian099/art ...
- 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉
YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...
- SpringMVC工作原理及源码解析
SpringMVC工作原理及源码解析 一:SpringMVC原理图 二:SpringMVC的主要组件 1.前端控制器DispatcherServlet: 2.处理器映射器HandlerMapping: ...
最新文章
- [改善Java代码]生成子列表后不要再操作原列表
- rabbitmq java教程_GitHub - maxwellyue/rabbitmq-tutorial-java: RabbitMQ官方教程的翻译和说明--Java版...
- XStream转换Java对象与XML
- loginform登录表单 vs_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...
- 【HDU - 1530】Maximum Clique(最大团问题,图论)
- 漫步最优化二十八——三次插值法
- 过程中存根的作用有_聚氨酯发泡胶有哪些作用?使用过程中表现出哪些特点?...
- 进程线程与栈、堆的关系
- 32怎么通过一个按键实现不同工作模式_stm32几种低功耗模式的实现和差别
- 【转】数组指针指针数组
- 什么是订单管理系统OMS
- matlab 连续傅里叶变换,matlab快速傅里叶变换.ppt
- HTML静态网页作业——海贼王主题网页设计制作6个页面(HTML+CSS)
- 开关量采集模块支持PWM占空比输出无线数据采集模块Modbus TCP协议
- 让计算机休眠的命令,电脑怎么取消休眠?关闭休眠命令是什么?
- mysql插入表情_向MySQL数据库中插入带emoji表情符的数据时报错
- Oracle什么时候创建索引最好
- EXCEL中怎样提取部分特定的文本?
- WDN302国产化网络存储控制模块
- Android应用开发性能优化完全分析