LinkedList源码解析

LinkedList源码实际上不算复杂,底层使用了内部类Node,每个Node存储了当前节点数据,直接前驱和直接后继的引用,也就是双向链表;同时LinkedList实现了Deque接口,也就是实现了双端队列相关操作api:

public class LinkedList{
     transient int size = 0;

    /**
     * 记录第一个节点的索引
     */
    transient MyLinkedList.Node first;

    /**
     * 记录最后一个元素
     */
    transient MyLinkedList.Node last;

    /**
     * 默认的构造方法
     */
    public MyLinkedList() {
    }

    /**
     * Links e as first element.
     */
    private void linkFirst(E e) {
        final MyLinkedList.Node f = first;
        final MyLinkedList.Node newNode = new MyLinkedList.Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
    }

    /**
     * 将e作为链表的最后一个元素
     */
    void linkLast(E e) {
        //记录当前链表的最后一个元素
        final MyLinkedList.Node l = last;
        //创建一个新的Node节点,该节点的直接前驱是当前节点的最后一个元素,该节点的元素是当前参数中的元素,该节点的直接后继是空
        final MyLinkedList.Node newNode = new MyLinkedList.Node<>(l, e, null);
        //更新当前链表的最后一个节点
        last = newNode;
        if (l == null)
            //如果第一个节点为空,则当前添加的是第一个元素,则更新first成员变量为当前节点
            first = newNode;
        else
            //如果第一个节点不为空,因为Node是一个双向链表,更新原节点到新节点的指针,即pre.next-->newNode
            l.next = newNode;
        size++;
    }

    private static class Node {
        E item;
        MyLinkedList.Node next;
        MyLinkedList.Node prev;

        Node(MyLinkedList.Node prev, E element, MyLinkedList.Node next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
}

 

你可能感兴趣的:(源码系列-jdk源码)