集合之LinkedList(含JDK1.8源碼分析)
阿新 • • 發佈:2019-02-11
數據 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; //構造新節點 finalNode<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源碼分析)