1. 程式人生 > >集合之LinkedList(含JDK1.8源碼分析)

集合之LinkedList(含JDK1.8源碼分析)

數據 element 分享圖片 分析 是否 舉例 ron 結構性 new

LinkedList的數據結構

LinkedList的增刪改查

增:add

  說明:add函數用於向LinkedList中添加一個元素,並且添加到鏈表尾部。具體添加到尾部的邏輯是由linkLast函數完成的。

舉例:

public class Test {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("zhangsan");
        list.add("lisi");
        list.add(
"wangwu");
     
list.add("zhangsan");
     System.out.println(list);
  }
}

結果:

[zhangsan, lisi, wangwu, zhangsan]

add源碼分析:

/**
     * Appends the specified element to the end of this list.
     *
     * <p>This method is equivalent to {@link #addLast}.
     *
     * @param e element to be appended to this list
     * 
@return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { linkLast(e); return true; }

LinkLast方法如下:

/**
     * Links e as last element.
     */
    void linkLast(E e) {
        //將last節點保存
        final Node<E> l = last;
        //構造新節點
        final
Node<E> newNode = new Node<>(l, e, null); //將新構造的節點賦值給last節點,便於下次添加元素時使用 last = newNode; //判斷保存的last節點是否為null if (l == null) //為null,首次添加,first節點與last節點一樣,都是新節點 first = newNode; else //不為null,說明list中已有元素,將newNode賦值給未添加元素e之前,list中已經存在的last節點的next屬性 l.next = newNode; //size加1 size++; //結構性修改加1 modCount++; }

圖示說明添加元素後鏈表狀態的改變:

list.add("zhangsan");

技術分享圖片

技術分享圖片

list.add("lisi");

技術分享圖片

list.add("wangwu");

技術分享圖片

由此可見,雙向鏈表的含義即:由上一個節點的next屬性可以得到下一個節點,下一個節點的prev屬性可以得到上一個節點。上下兩個節點之間互相指向關聯。

集合之LinkedList(含JDK1.8源碼分析)