LinkedList的底層實現

Adrian_Dai發表於2018-03-04

 

public class LinkedList<E>

    extends AbstractSequentialList<E>

    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

public interface Deque<E> extends Queue<E>

其實是雙端佇列

 

 

實現原理

List介面的連結串列實現,並提供了一些佇列,棧,雙端佇列操作的方法

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;

        }

    }

ArrayList對比,LinkedList插入和刪除操作更加高效,隨機訪問速度慢

可以作為棧、佇列、雙端佇列資料結構使用;

非同步,執行緒不安全;

ArrayList、Vector一樣,LinkedList的內部迭代器存在“快速失敗行為”;

支援null元素、有順序、元素可以重複

 

實現的Deque介面

雙端佇列

雙端佇列是指允許兩端都可以進行入隊和出隊操作的佇列,其元素的邏輯結構仍是線性結構。將佇列的兩端分別稱為前端和後端,兩端都可以入隊和出隊。

 

 

其實是間接實現Queue介面

主要的方法:

boolean offer(E e);

將物件e插入佇列尾部,成功返回true,失敗(沒有空間)返回false;

E poll();

獲取並移除佇列頭部元素,如果佇列為空,返回null;

E peek();

獲取但不移除佇列頭部元素,如果佇列為空,返回null;

boolean offerFirst(E e);

將物件e插入到雙端佇列頭部

boolean offerLast(E e);

將物件e插入到雙端佇列尾部;

 

Poll出隊方法操作

public E poll() {

        final Node<E> f = first;

        return (f == null) ? null : unlinkFirst(f);

    }

private E unlinkFirst(Node<E> f) {

        // assert f == first && f != null;

        final E element = f.item;

        final Node<E> next = f.next;

        f.item = null;

        f.next = null; // help GC

        first = next;

        if (next == null)

            last = null;

        else

            next.prev = null;

        size--;

        modCount++;

        return element;

    }

主要實現在unlinkFirst方法內,首先直接獲取被刪節點,臨時儲存其具體引用的物件element和下個引用next,然後將被刪節點物件引用和下個節點引用置null給gc回收,改變雙端佇列隊頭結點為被刪節點的下個引用next,如果next為空,將雙端佇列的隊尾結點last置null,否則將next節點的前引用置null;佇列長度減減,操作次數加加(快速失敗機制,參考HashMap),返回被刪節點引用的具體物件

 

 

相關文章