標籤:需要 OLE ansi 超過 效率 輸出 空間 remove 位置
LinkedList底層為雙向鏈表同樣繼承了AbstractSequentialList<E>,跟ArrayList的數組相比讀取效率低,不支援隨機讀取,片段化空間利用率高,平均隨機插入效率相對高。同時可以用來實現queue。屬性有:
transient int size = 0;list大小
transient Node<E> first;頭指標
transient Node<E> last;尾指標
private void linkFirst(E e)
void linkLast(E e)
將e添加到鏈表的頭部和尾部,size與modCount加一
void linkBefore(E e, Node<E> succ)將e插入到succ結點之前
private E unlinkFirst(Node<E> f)
private E unlinkLast(Node<E> l)
移除頭部或尾部結點,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將讀取到的元素加入鏈表末尾
Java LinkedList類源碼解析