Collection - LinkedList源码解析

90 阅读2分钟

概述

LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。

LinkedList实现

数据结构

LinkedList底层通过双向链表实现,LinkedList通过 first 和 last 引用分别指向链表的第一个和最后一个元素。当链表为空的时候first和last都指向null。

    transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

Node 节点:

    private static class Node<E> {
        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;
        }
    }

具体方法

List 类方法
add(E e) : 在末尾插入元素,因为有last指向链表末尾,在末尾插入元素的花费是常数时间

add(int index, E element) : 先查找位置在插入(可以从head或tail节点开始找,那个快用那个)

E get(int index)
E set(int index, E element)
E remove(int index)
int indexOf(Object o) : 第一次出现的位置
int lastIndexOf(Object o) : 最后一次出现的位置
Queue 方法
# 如果LinkedList为空则返回 null
E peek() :获取第一个元素
E poll() :获取并删除第一个元素

# 如果LinkedList为空则抛出异常
E element() :获取第一个元素
E remove() : 获取并删除第一个元素

offer(E e) :在末尾添加元素
Deque 方法
offerFirst(E e) :在头部添加
offerLast(E e) :在尾部添加

E peekFirst() :获取第一个
E peekLast() :获取最后一个

E pollFirst() :获取并删除第一个元素
E pollLast() :获取并删除最后一个元素

push(E e) :在头部添加
E pop() :删除末尾

# 从头向尾部遍历
boolean removeFirstOccurrence(Object o) :删除第一次出现的指定元素
boolean removeLastOccurrence(Object o) :删除最后一次出现的指定元素