LinkedList源码解析

来源:互联网 发布:数据分析研究生专业 编辑:程序博客网 时间:2024/06/01 18:09

借鉴博客:http://blog.csdn.net/zw0283/article/details/51132161
正如上面这篇博客所述,在1.6包括1.6之前,LinkedList都是一个环形链表结构,直到1.7包括1.7之后LinkedList变成了一个线性链表结构了。

如果大家不是很懂链表的结构,可以去翻看上面的这篇博客

一.LinkedList的定义

这里写图片描述
LinkedList和ArrayList同样提供了List和Serializable接口,其中AbstractSequentialList也是提供了List接口,这里再次声明出来只是为了更加清晰。
这里写图片描述
这里写图片描述
Deque接口定义了双端队列的操作
这里写图片描述

二.LinkedList的全局变量

这里写图片描述

transient int size = 0;//当前链表有多少节点
transient Node<E> first;//指向链表第一个节点的引用
 transient Node<E> last;//指向链表最后一个节点的引用

三.LinkedList的构造方法

1.无参构造

public LinkedList() {   }

2.有参构造

 public LinkedList(Collection<? extends E> c) {//调用第一个构造方法构造一个空的链表,之后通过addAll将c中的元素全部添加到链表中,下面我们先来看看addAll方法吧        this();        addAll(c);    }

四.LinkedList的普通方法

1.addAll(Collection

 public boolean addAll(Collection<? extends E> c) {        return addAll(size, c);//调用addAll(size,c)    }

2.addAll(int index, Collection

public boolean addAll(int index, Collection<? extends E> c) {        checkPositionIndex(index);//翻看方法发现就是判断index插入位置是否超过链表的长度或者小于0,如果是就抛出IndexOutOfBoundsException异常        Object[] a = c.toArray();//把c转换成Object数组        int numNew = a.length;        if (numNew == 0)//数组为空直接返回false            return false;       //下面都是数组不为空的情况了  为了看明白这个可以先看看下面的Node类        Node<E> pred, succ;        if (index == size) {            succ = null;            pred = last;        } else {            succ = node(index);            pred = succ.prev;        }        for (Object o : a) {            @SuppressWarnings("unchecked") E e = (E) o;            Node<E> newNode = new Node<>(pred, e, null);            if (pred == null)                first = newNode;            else                pred.next = newNode;            pred = newNode;        }        if (succ == null) {            last = pred;        } else {            pred.next = succ;            succ.prev = pred;        }        size += numNew;        modCount++;        return true;    }
 private static class Node<E> {//Node是LinkedList的内部私有类        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;        }    }

这段代码其实还是比较好理解的,分两种情况,一种是原来的链表为空,一种是原来的链表为值
这里就看看后者吧

2 0