LinkList顾名思义,就是通过链表实现的集合,优点就是插入、删除速度快,但遍历速度不及ArrayList,本质原因还是数据结构的不同,至于ListList和ArrayList的优缺点网上很多,这里不再赘述。

前言

LinkList源码其实不难,主要关注三个重要的方法和Node内部类:

  1. 将新添加的元素e作为链表的最后一个元素并维护进去
    linkLast(E e)
  2. 从链表中删除x节点的链接
    unlink(Node<E> x)
  3. 根据传入的index值,返回对应的节点node
    node(int index)
  4. 私有内部静态类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 底层⽤的是链表)相关推荐

  1. HashMap 实现原理及源码解析(jdk8 底层⽤的是数组+链表/红⿊树)

    本文会通过HashMap中的put方法为入口,进行源码解读,文章较长,需要耐心阅读 说明 /** */: 代表注释,区别于例子注释 egx::代表例子注释 解读前须知 源码主要关注4⼤点: 确定哈希桶 ...

  2. ArrayList 实现原理及源码解析(jdk8 底层⽤的是数组)

    本文会主要从集合扩容.添加元素.删除元素三个方面来进行源码解读 在开始解读之前,我们先来看一下ArrayList添加一个元素的流程 基本在图中已经比较全面的说明了add一个元素的全流程 源码解读 我们 ...

  3. 【特征匹配】ORB原理与源码解析

    相关 : Fast原理与源码解析 Brief描述子原理与源码解析 Harris原理与源码解析 http://blog.csdn.net/luoshixian099/article/details/48 ...

  4. Redis进阶- Redisson分布式锁实现原理及源码解析

    文章目录 Pre 用法 Redisson分布式锁实现原理 Redisson分布式锁源码分析 redisson.getLock(lockKey) 的逻辑 redissonLock.lock()的逻辑 r ...

  5. PCA-SIFT原理及源码解析

    相关: SIFT原理与源码解析 SURF原理与源码解析 ORB原理与源码解析 FAST原理与源码解析 BRIEF描述子原理与源码解析 Harris原理与源码解析 转载请注明出处:http://blog ...

  6. Spring Boot 核心原理与源码解析 - 目录

    准备重新写 SpringBoot 配置文件解析原理 , 先在这里把要写的内容记下来 Spring Boot 核心原理与源码解析 - 目录 1\何时解析\如何解析 application.propert ...

  7. 【特征匹配】BRIEF特征描述子原理及源码解析

    相关:Fast原理及源码解析 Harris原理及源码解析 SIFT原理及源码解析 SURF原理及源码解析 转载请注明出处: http://blog.csdn.net/luoshixian099/art ...

  8. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  9. SpringMVC工作原理及源码解析

    SpringMVC工作原理及源码解析 一:SpringMVC原理图 二:SpringMVC的主要组件 1.前端控制器DispatcherServlet: 2.处理器映射器HandlerMapping: ...

最新文章

  1. [改善Java代码]生成子列表后不要再操作原列表
  2. rabbitmq java教程_GitHub - maxwellyue/rabbitmq-tutorial-java: RabbitMQ官方教程的翻译和说明--Java版...
  3. XStream转换Java对象与XML
  4. loginform登录表单 vs_【VSRC唯科普】穿越网页表单与登录窗口的采集(第9/14篇)...
  5. 【HDU - 1530】Maximum Clique(最大团问题,图论)
  6. 漫步最优化二十八——三次插值法
  7. 过程中存根的作用有_聚氨酯发泡胶有哪些作用?使用过程中表现出哪些特点?...
  8. 进程线程与栈、堆的关系
  9. 32怎么通过一个按键实现不同工作模式_stm32几种低功耗模式的实现和差别
  10. 【转】数组指针指针数组
  11. 什么是订单管理系统OMS
  12. matlab 连续傅里叶变换,matlab快速傅里叶变换.ppt
  13. HTML静态网页作业——海贼王主题网页设计制作6个页面(HTML+CSS)
  14. 开关量采集模块支持PWM占空比输出无线数据采集模块Modbus TCP协议
  15. 让计算机休眠的命令,电脑怎么取消休眠?关闭休眠命令是什么?
  16. mysql插入表情_向MySQL数据库中插入带emoji表情符的数据时报错
  17. Oracle什么时候创建索引最好
  18. EXCEL中怎样提取部分特定的文本?
  19. WDN302国产化网络存储控制模块
  20. Android应用开发性能优化完全分析

热门文章

  1. html5 dropdownlist,使用HTML5 FindByValue下拉列表(html5 dropdownlist using F
  2. 全网最好懂的Spring AOP原理
  3. Markdown入门指导
  4. 看看80万程序员怎么评论:前端程序员会不会失业?
  5. 用Mindjet MindManager 15 打开文件后停止响应的解决方法
  6. 两款网站页面翻译插件
  7. 看图工具—IrfanView
  8. 十大原因宣判Windows死亡 Linux终将胜利
  9. 浅谈JavaScript中的apply、call和bind
  10. MongoDB索引,性能分析