LinkList源码分析
概况
LinkedList与ArrayList一样实现了List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现。基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则不及ArrayList。
签名
|
|
· LinkedList 是一个继承于AbstractSequentialList的双向循环链表,且头结点中不存放数据。它也可以被当作堆栈、队列或双端队列进行操作。
· LinkedList 实现 List 接口,能对它进行队列操作。
· LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
· LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
· LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
· LinkedList 是非同步的。
变量
|
|
· first和last分别指向头节点和尾节点。
· size为LinkedList中元素个数。
构造器
|
|
|
|
包含“集合”的构造函数:创建一个包含“集合”的LinkedList
方法
|
|
· 在非空节点前插入一个元素
|
|
· 删除list的头节点,并返回头节点的值,unlinkLast与之类似,返回尾节点的值
|
|
· 将x节点删除,返回被删除节点的值
|
|
|
|
· 插入某个容器类
|
|
· 取list的第一个元素
· 那么,peek()和getFirst()有什么区别?
同样都是返回表中的第一个元素,当为空表时,peek返回一个null,而getFirst会抛出一个NoSuchElementException异常
LinkedList有一个内部类:ListItr。在LinkedList中提供了获取ListItr对象的方法:listIterator(int index)。
ListItr实现了ListIterator接口,可知它是一个迭代器,通过它可以遍历修改LinkedList。
|
|
· lastRetured最近一次返回的节点
· next对下一个元素的引用
· nextIndex下一个节点的index
· expectedModCount修改次数的期望值,初始值为modCount,modCount是AbstractList类中的一个成员变量
· 构造方法接收一个index参数,返回一个ListItr对象,如果index<0或>size,返回null
· checkForComodification();判断expectedModCount和modCount,既修改次数,是否相等,以确保通过ListItr的修改操作正确的反映在LinkedList中,不相等的时候就抛出ConcurrentModificationException异常
· forEachRemaining(Consumer<? super E> action);为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常0或>
|
|
serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。