LinkedList源码-add源码分析
LinkedList概述
LinkedList是List中的其中一个实现类,属于Collection中的一个集合,
LinkedList 是一个继承了AbstractSequentialList这个抽象类.
同时实现了List, Deque, Cloneable, java.io.Serializable这几个接口,
所以,LinkedList有了这些特性:
LinkedList拥有序列化和克隆的特性.
LinkedList 底层实现的数据结构为双向链表(实现了Deque接口)
LinkedList的增删改查都跟双向链表一样
接下来先讲解LinkedList的add方法
Add方法
源码:
首先进入它调用的linkLast方法的源码进行查看,如图所示:
首先是将last这个元素赋值给Node 这个节点上,
Last的定义我们可以去看看,如图所示:
Last结点用transient修饰,表示这个结点不会被序列化
链表的操作都是基于结点来进行的
我们去看看这个Node是在LinkedList中如何定义的,如图所示:
这是一个定义在Linkedlist类中的一个内部类,里面定义了三个变量, item, next, prev.
item代表要添加的元素,
next表示下一个结点的引用,
prev表示上一个节点的引用;
其中,构造函数中传入的参数分别是这个结点的上个节点,这个结点元素,和下一个节点,当放入一个新的元素的时候,last结点就是这个新添加的结点的前驱结点,由于添加的元素是整个链表最后一个元素,所以他的后继结点设为null,
然后将这个新的结点地址赋值给last结点,表明当前的新结点为链表最后一个结点,
如果last结点在一开始就是null的,说明还没有任何元素,也没有链表,那就会将新的结点赋值给first结点,
如图所示,first结点也是用transient修饰,表示不可序列化.
表示当前的新结点为头结点,如果不会null,则将新结点赋值给last结点的next结点中,表示为last结点的后继结点.
之后,size++,size刚开始初始化的时候为0,如图所示:
之后,每添加一个元素就进行++操作,这样做可以方便统计这个链表之后共有多少个元素.
之后有个modCount++这个操作,我们简单的说说modCount这个字段是啥个意思吧.
modCount字段分析
一开始modCount设置为0,之后,对链表每一次的操作,就会i进行++操作,这是一个状态字段,为了记录表被修改的标记,所以只需要前后对比该字段就知道中间这段时间表是否被修改。
这里有个公共特点, 所有使用modCount属性的全是线程不安全的,说明这个字段主要是解决线程安全用的.
在一个迭代器初始的时候会赋予它调用这个迭代器的对象的expectedModCount,在迭代器遍历的过程中,一旦发现modCount和迭代器中存储的expectedModCount不一样那就抛异常,这是一种机制,称为Fail-Fast 机制
这就是modCount这个字段的作用.
如果添加元素完成后,就会返回一个ture,告知调用者这个元素已经被添加到链表中,这个add的操作就完成了.