【数据结构】7.java源码关于LinkedList
关于LinkedList的源码关注点
1.从底层数据结构,扩容策略
2.LinkedList的增删改查
3.特殊处理重点关注
4.遍历的速度,随机访问和iterator访问效率对比
1.从底层数据结构,扩容策略
构造函数不做任何操作,只要再add的时候进行数据初始化操作,以操作推动逻辑,而且linkedlist是一个双向链表,所以可以向前向后双向遍历
由于构造函数并没有任何操作,其实这里我们可以先看新增操作,并且因为用的是链表所以无法随机访问,这里随机读取就会比较慢

底层结构就是size,首节点,尾节点,还有就是一个List都有的共性就是modCount,这值用来记录这个list被修改了多少次
2.LinkedList的增删改查
2.1 add操作,linklast
Add操作的实质就是进行linklast操作
linklast的操作就是再最后吧节点添加到尾部,并修正size大小

    public boolean add(E ele) {
        linkLast(ele);
        return true;
    }
我们看看如果是在指定的位置插入元素的操作
首先要确认index再指定范围内
这里有个小优化,如果是在末尾进行添加的话,我们直接调用linklast就可以了
如果不是最后一个,那么首先要获取指定位置的node节点,我们遍历指定位置的时候
可以确定index的位置如果过半了,那么就从后往前,如果没有过半,那么就从前往后
1.直接再index创建一个节点,然后前后合并一下
2.吧原来的index位置的节点断开,吧这个节点的pre指向新节点
3.判断前置节点是否到头了,为空
4.把前置节点的next指向新节点
先看看node定位操作

然后我们看看linkbefore,前置插入
public void linkBefore(E e, Node<E> succ) {
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred, e, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }
那么我们需要插入到指定的位置的方法就可以很简单的实现了
Linkbefore(e, node(index))即可

2.2 删除
查看源码,比较remove(),remove(object),remove(index)等等操作,归根到底还是一个unlink操作
我们需要对指定的节点进行unlink操作
就2步操作
1.当前节点的前一个节点指向当前节点的下一个节点,说白了node.pre.next = node.next;
2.当前节点的下一个节点的前置节点指向当前节点的上一个节点:node.next.pre = node.pre;
其他细节部分就是首尾节点的处理
public E unlink(Node<E> node) {
        // assert x != null;
        //这里需要操作的就是三个节点,前置节点,当前节点,后置节点
        final E element = node.item;
        final Node<E> prev = node.prev;
        final Node<E> next = node.next;
        //当前节点的前一个节点指向当前节点的下一个节点,说白了node.pre.next = node.next;
        if (prev == null) {
            //避免首节点操作
            first = next;
        } else {
            prev.next = next;
            node.prev = null; //断开原始连接
        }
        //当前节点的下一个节点的前置节点指向当前节点的上一个节点:node.next.pre = node.pre;
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            node.next = null;
        }
        //清除当前节点
        node.item = null;
        size--;
        modCount++;
        return element;
    }
其余操作基本就是调用unlink方法进行操作

修改set和获取get就不多说了,就注意一点就是set操作的时候,会返回旧值,并且这两个操作不会修改modCount值,也就是不会产生链表变动
3.特殊处理重点关注,iterator,序列化
对于iterator这个就不多说了,其实还是调用上面的那些方法,遍历也就是next和pre和循环遍历没差别
但是注意一点就是通过迭代器进行remove和add是可以的,但是注意一点,如果使用迭代器进行remove或者add操作的通过,还使用了一般的remove和add那么就会使迭代器失效
序列化这里我们先只做一个了解,后续开章节专门学习一下java的序列化:
进行序列化、反序列化时,虚拟机会首先试图调用对象里的writeObject和readObject方法,进行用户自定义的序列化和反序列化。如果没有这样的方法,那么默认调用的是ObjectOutputStream的defaultWriteObject以及ObjectInputStream的defaultReadObject方法。换言之,利用自定义的writeObject方法和readObject方法,用户可以自己控制序列化和反序列化的过程。
--------------------- 
版权声明:本文为CSDN博主「zthgreat」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014634338/article/details/78165127
4.遍历的速度,随机访问和iterator访问效率对比
这个问题其实也可以舍弃掉了,这里遍历的实质还是使用链表的遍历方式进行遍历
5.是否支持多线程
LinkedList 是线程不安全的,允许元素为null的双向链表。
参考:https://blog.csdn.net/u014634338/article/details/78165127
【数据结构】7.java源码关于LinkedList的更多相关文章
- 浅析Java源码之LinkedList
		
可以骂人吗???辛辛苦苦写了2个多小时搞到凌晨2点,点击保存草稿退回到了登录页面???登录成功草稿没了???喵喵喵???智障!!气! 很厉害,隔了30分钟,我的登录又失效了,草稿再次回滚,不客气了,* ...
 - Java源码-集合-LinkedList
		
基于JDK1.8.0_191 介绍 LinkedList是以节点来保存数据的,不像数组在创建的时候需要申请一段连续的空间,LinkedList里的数据是可以存放在不同的空间当中,然后以内存地址作为 ...
 - java源码阅读LinkedList
		
1类签名与注释 public class LinkedList<E> extends AbstractSequentialList<E> implements List< ...
 - 如何阅读Java源码 阅读java的真实体会
		
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
 - 如何阅读Java源码
		
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...
 - Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
		
http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...
 - [收藏] Java源码阅读的真实体会
		
收藏自http://www.iteye.com/topic/1113732 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我 ...
 - 如何阅读Java源码?
		
阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...
 - Java源码阅读的真实体会(一种学习思路)
		
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...
 
随机推荐
- luoguP4112 [HEOI2015]最短不公共子串 SAM,序列自动机,广搜BFS
			
luoguP4112 [HEOI2015]最短不公共子串 链接 luogu loj 思路 子串可以用后缀自动机,子序列可以用序列自动机. 序列自动机是啥,就是能访问到所有子序列的自动机. 每个点记录下 ...
 - Problem 3 基站建设 (station.cpp)———2019.10.6
			
在此郑重的感激wxyww大佬 wxyww tql [题目描述]小 Z 的爸爸是一位通信工程师,他所在的通信公司最近接到了一个新的通信工程建设任务,他们需要在 C 城建设一批新的基站.C 城的城市规划做 ...
 - SpringCloud基本模块分配搭建以及负载均衡
			
springcloud是基于springboot的一套微服务的解决方案,springboot可以快速构建单个应用服务,而springcloud没有重复造轮子而是将现有的技术(服务发现,负载均衡等)整合 ...
 - webstorm永久破解
			
准备 1. webstorm下载 本次使用的是2017.3.3版本,如果找不到那么在此附上:webstorm各版本下载地址. 前段时间有朋友反馈破解不成功,今天本人亲测2017.3.3仍可以破解成功, ...
 - 洛谷P1084 疫情控制
			
题目 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点.因此可以考虑二分时间,然后 ...
 - GCC编译UDF和gdb调试UDF
			
Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...
 - GIT-本地仓库
			
用户配置 git config --global user.name "name" git config --global user.email "123@qq.com& ...
 - mysql 层级结构查询
			
描述:最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询, ...
 - 暑假gosh计划
			
[要参与的事项]: 1.大创 2.CTF 3.ACM 4.自己的巴拉巴拉巴 [基本目标]: 1.大创 学完一本Java入门教材 学习Material Design,了解典型交互,进行ui初步设计 2. ...
 - Spring Boot通过Configuration配置多数据源
			
本文结合SpringBoot + MyBatis + MySql进行多数据源配置,DataSource信息采用自定义dataSource.properties进行配置. 1.文件结构如下: 2.1 p ...