Java集合---LinkedList(3)

用途與特色
可用於存儲有序數據,底層使用鏈表形式進行數據存儲。 該集合理論上只要內存能夠存放數據,就能夠一直添加,是無限擴容的。node

實現算法算法

底層使用Node的自定義對象進行存儲,該對象中包含當前存儲的數item、上一個節點prev、和下一個節點next 這三個屬性來實現。但該鏈表是非環形,第一個first的prev爲null,最後一個last的next爲null,這樣就造成了一下非閉環手拉手的效果。安全

LinkedList有3個主要屬性size、first、last。線程

添加code

鏈表添加數據

添加與刪除的操做邏輯基本相同,再也不贅述。對象

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

    /**
     * Links e as last element.
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

    /**
     * Inserts element e before non-null Node succ.
     */
    void linkBefore(E e, Node<E> succ) {
        // assert succ != null;
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred, e, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }

查找 鏈表查找blog

/**
     * Returns the (non-null) Node at the specified element index.
     */
    Node<E> node(int index) {
        // assert isElementIndex(index);
	//根據傳入index大小,判斷從鏈表的開始搜索,仍是結尾搜索
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

擴容機制內存

擴容時機:每次添加、刪除都在擴容ci

是否線程安全,爲何?element

非線程安全,由於在源碼中未對數據的添加、刪除、讀取等作鎖操做

根據jdk1.8版本源碼解讀

相關文章
相關標籤/搜索