LinkedList底層爲雙向鏈表一樣繼承了AbstractSequentialList<E>,跟ArrayList的數組相比讀取效率低,不支持隨機讀取,碎片化空間利用率高,平均隨機插入效率相對高。同時能夠用來實現queue。屬性有:java
transient int size = 0;list大小node
transient Node<E> first;頭指針數組
transient Node<E> last;尾指針spa
private void linkFirst(E e)指針
void linkLast(E e)對象
將e添加到鏈表的頭部和尾部,size與modCount加一繼承
void linkBefore(E e, Node<E> succ)將e插入到succ結點以前element
private E unlinkFirst(Node<E> f)rem
private E unlinkLast(Node<E> l)get
移除頭部或尾部結點,size減1,modCount加1,將移除結點的next prev item值都設爲null以觸發gc
E unlink(Node<E> x)移除結點x,須要再判斷有無前驅和後驅結點,若沒有則要改變頭尾指針,一樣將移除結點的next prev item值都設爲null以觸發gc
public E getFirst()
public E getLast()
返回first或last指向的結點,鏈表爲空時拋錯
public E removeFirst()
public E removeLast()
調用unlinkLast移除並返回頭部或尾部的結點,鏈表爲空時拋錯
public void addFirst(E e)調用linkFirst(e),將元素插入到頭部
public void addLast(E e)
public boolean add(E e)
兩個方法都是調用linkLast(e),除了返回值外是等價的
public boolean remove(Object o)o==null時,經過unlink方法移除全部x==null的元素,不然移除o.equals(x)的元素,每有一個符合的元素就調用一次unlink因此modCount的增長值爲移除元素的個數
public boolean addAll(int index, Collection<? extends E> c)將c中的集合插入到index位置。首先檢查index是否符合鏈表長度範圍,若c中沒有元素則直接返回false,不然遍歷c中的元素產生新的結點並連接到index指向位置,檢查是否須要修改first和last的位置,最後修改size和modCount++
public void clear()遍歷全部結點,將last prev item所有設爲null,size爲0,modCount++
public E set(int index, E element)檢查index範圍後設置爲item=element,不會改變modCount
public void add(int index, E element)檢查index範圍,若index==size即插入再末尾,調用linkLast(element),不然調用linkBefore(element, node(index))所以會形成modCount++
public E remove(int index) 檢查index範圍,index >= 0 && index < size則調用unlink(node(index))移除元素,modCount++
Node<E> node(int index)返回index下標的結點,若index超過size的一半則從last開始向頭尋找,不然從first開始向後尋找
public int indexOf(Object o)尋找與o相等的下標最小的鏈表元素,若沒有則返回-1,比較邏輯依然根據o是不是null來區分
public int lastIndexOf(Object o)從尾部開始搜索第一個符合條件的元素下標,和上面一個方法相似
public E peek()返回first指向結點的item,若爲空則返回null
public E element()也是返回first.item,區別是爲空會拋錯
public E poll()在peek()的基礎上,若不爲null會刪除第一個元素
public boolean offer(E e)同add(e)
public boolean offerFirst(E e)同addFirst
public boolean offerLast(E e)同addLast
public E peekFirst()同peek()
public E peekLast()返回尾部元素,爲空則返回null
public E pollFirst()同poll()
public E pollLast()返回尾部元素,爲空則返回null,不爲空移除尾部元素
public void push(E e)將e添加到頭部
public E pop()移除頭部元素
public boolean removeFirstOccurrence(Object o)同remove(o)
public boolean removeLastOccurrence(Object o)移除最後一個與o相等的元素
public Object[] toArray()新建一個數組,遍歷鏈表將元素複製到數組中
private void writeObject(java.io.ObjectOutputStream s)
private void readObject(java.io.ObjectInputStream s)
序列化的方式和ArrayList相同,是經過對象輸入輸出流來完成,輸入時調用linkLast將讀取到的元素加入鏈表末尾