Java LinkedList類源碼解析

來源:互聯網
上載者:User

標籤:需要   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類源碼解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.