LinkedList 源码

注释

该List是双向链表,也就是说每一个节点都有一个指向前面的指针和一个指向后面节点的指针.

继承关系:

LinkedList

该类继承了AbstractSequentialList,AbstractSequentialList是一个抽象类,它又继承了AbstractList,它将其中的一下方法进行重写,如下图:

LinkedList 源码_第1张图片
AbstractSequentialList的所有方法

作为一个List,它自然要实现List接口,Cloneable实现深,java.io.Serializable实现序列化.


成员变量:

LinkedList 源码_第2张图片
transient表示序列化时这些变量不需要进行持久化

size代表的是list的长度,其余两个为Node对象,first指向List的头,last指向List的尾部,其中Node定义如下:

LinkedList 源码_第3张图片
Node

该类内部有一个变量用于保存元素,另外两个Node分别指向前一个Node和后一个Node.


构造方法:

LinkedList 源码_第4张图片
LinkedList(),LinkedList(Collection c)

两个构造方法,其中一个是无参的,另外一个接收一个collection,调用addAll()对List进行初始化.


成员方法:

LinkedList 源码_第5张图片
linkFirst(E)

私有方法,外部无法直接调用,该方法的作用是将接收的元素设置为first

接收一个元素,构造一个prev为null的Node对象,再将其设置为头部也就是first变量.进行该操作分为两种情况,一种是List中已经有元素存在即first已经有元素,在将参数设置为头节点的同时,需要将原来头节点的prev指向现在的first,保证List不会断开;而当List是空的时候,需要将last也指向头节点.此刻first=last.

LinkedList 源码_第6张图片
linkLast(E e)

default方法,同一包内的类可见.作用是将传入的元素设置为last.

构造一个next为null的节点,将其prev设置为last,并将last指向自己,然后判断原last是否为空,如果为空则意味着原来的List中是没有元素的,此时last也是first,需要将furt指向自己.如果不为空,那么将原来的last的next指向新增加的Node.

LinkedList 源码_第7张图片
linkBefore(E e, Node succ)

默认方法,同一包内可见.做用是在指定的节点前面插入一个节点.

构建newNode使其的prev指向succ的prev,next指向succ,这样将newNode连接上了List,在将succ.prev指向新的节点,pred指向新的节点完成双向连接.同时判断succ是否时first,如果是的话需要将first指向新的节点.

LinkedList 源码_第8张图片
unlinkFirst(Node f)

私有方法,同一类内可见.作用是将first移除并返回其中的元素.

通过将first中的element和next设置为null,调用系统GC,同时将first指向next,并且把next的prev设置为空.最后判断first是否还是last.如果是还要将last设置为null.

LinkedList 源码_第9张图片
unlink(Node x)

默认方法,同一包内可见.作用将传入的节点从List中删除.

获取传入节点的prev和next,判断该节点是否是last或first,如果是要进行调整,否则将prev和next进行相互的链接,并返回节点元素.


LinkedList 源码_第10张图片
getFirst()& getLast()

公有方法,所有类可见.作用:获取first或last的元素.

LinkedList 源码_第11张图片
removeFirst()&removeLast()

公有方法,所有类可见.作用:移除first或last.

通过调用上面提到的unlinkFirst(),unlinkLast()完成

LinkedList 源码_第12张图片
addFirst()&addLast()

作用:往list中插入first或last

通过上面提到的linkFirst()和linkLast()完成

LinkedList 源码_第13张图片
add(E)

公有方法,作用:添加元素到list的尾部

通过linkLast()完成

LinkedList 源码_第14张图片
remove(Object o)

公有方法,作用:移除指定的元素

通过next遍历整个list,对遇到的第一个节点,调用unlink()进行移除.

LinkedList 源码_第15张图片
addAll(Collection c)

公有方法,作用:将指定集合中所有的元素添加到List的尾部

调用addAll(size,Collection)

LinkedList 源码_第16张图片
addAll(int index, Collection c)

公有方法,作用:将传入的集合中的所有元素添加到指定的位置前面,当且仅当指定的位置是list的尾部时,将所有元素添加到list的末端

使用node()获取指定的节点,以指定节点大prev作为起始节点,将集合的元素一个个连接到后面.

LinkedList 源码_第17张图片
clear()

公有方法,作用:将list中的元素清空

LinkedList 源码_第18张图片
get(int index)&set(int index,E element)

公有方法,作用:get获取指定位置的元素,set设置指定位置的元素

二者都调用了node(int index)方法获取指定位置的元素

LinkedList 源码_第19张图片
node(int index)

默认方法,同一包下可见.作用:获取指定index的node

通过判断index与list中点的大小,确定时从first往后遍历或则是从last往前遍历.

LinkedList 源码_第20张图片
add(int index, E element),remove(int index)

公有方法,作用:add如果指定的位置是last,则将元素添加到list的尾部,否则将list添加到指定位置的前面.remove移除指定位置的元素

LinkedList 源码_第21张图片
indexOf(Object o)

公有方法,作用:从first往后遍历,获取第一个遇到的指定元素下标.

LinkedList 源码_第22张图片
lastIndexOf(Object o)

公有方法,从last往前遍历获取第一个遇到的指定元素下标.

LinkedList 源码_第23张图片
peek()&element()

公有方法.作用都是获取first的元素,区别peek在first为null时会返回null,而element则时抛出NoSuchElementException

LinkedList 源码_第24张图片
poll()

公有方法,作用:获取并移除第一个元素.

LinkedList 源码_第25张图片
offer(E e)

公有方法,作用添加元素到List的尾部.内部调用的是add()

你可能感兴趣的:(LinkedList 源码)