日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LinkedList 的实现原理浅析

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LinkedList 的实现原理浅析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自?LinkedList 的實現(xiàn)原理淺析

LinkedList內(nèi)部結(jié)構(gòu)

查看LinkedList的源碼,發(fā)現(xiàn)其繼承自AbstractSequentialList,實現(xiàn)了List,Deque,Cloneable以及Serializable接口,如:

也就意味著:

  • LinkedList?是一個繼承于AbstractSequentialList的雙向鏈表。它也可以被當(dāng)作堆棧、隊列或雙端隊列進(jìn)行操作。

  • LinkedList?實現(xiàn)?List?接口,能對它進(jìn)行列表操作。

  • LinkedList?實現(xiàn)?Deque?接口,即能將LinkedList當(dāng)作雙端隊列使用。

  • LinkedList?實現(xiàn)了Cloneable接口,即覆蓋了函數(shù)clone(),能克隆。

  • LinkedList?實現(xiàn)java.io.Serializable接口,這意味著LinkedList支持序列化,能通過序列化去傳輸。

從上述代碼可以看出,LinkedList中有size,first以及l(fā)ast全局變量,其作用分別是:

  • size?-- 存放當(dāng)前鏈表有多少個節(jié)點(diǎn)。

  • first?-- 指向鏈表的第一個節(jié)點(diǎn)的引用

  • last?-- ?指向鏈表的最后一個節(jié)點(diǎn)的引用

其中,Node是內(nèi)部類,內(nèi)容如下:

從上述代碼可以看出,

一個節(jié)點(diǎn)除了包含元素內(nèi)容之外,同時包含前一個節(jié)點(diǎn)和后一個節(jié)點(diǎn)的引用~

各個節(jié)點(diǎn)通過指定前一個節(jié)點(diǎn)和后一個節(jié)點(diǎn),最終形成了一個鏈表~

?

代碼示例:

輸出結(jié)果:

debug查看LinkedList的結(jié)構(gòu)如下:

形成了一個鏈表

方法 add 的實現(xiàn)

?

源代碼

add方法會調(diào)用linkLast方法,會在鏈表尾端添加節(jié)點(diǎn)~

linkLast方法步驟

  • 獲取原來的last節(jié)點(diǎn),然后創(chuàng)建一個新的節(jié)點(diǎn),其prev為原來的last節(jié)點(diǎn),其next節(jié)點(diǎn)為null

  • 將last只想新的節(jié)點(diǎn)

  • 如果原來的last節(jié)點(diǎn)為null,其實就是還沒有元素,那么新的節(jié)點(diǎn)同樣也是first節(jié)點(diǎn);如果不為null,則原來的last節(jié)點(diǎn)的next就是新的節(jié)點(diǎn)

  • 因為有新元素加入,size加1,且修改次數(shù)加1(modCount++)

?

方法 addAll 的實現(xiàn)

源代碼

addAll在LinkedList內(nèi)部其實就是調(diào)用了方法addAll(int index, Collection<? extends E> c)?

方法addAll(int index, Collection<? extends E> c)

方法addAll(int index, Collection<? extends E> c) 主要包含如下幾個步驟:

  • 檢查指定index是否合理

index的有效位置是[0,size]

  • 定義pred和succ節(jié)點(diǎn),并根據(jù)index的大小確定pred和succ節(jié)點(diǎn)

  • 對Collection轉(zhuǎn)換成數(shù)組(Object[] a = c.toArray())的元素進(jìn)行循環(huán)遍歷,確定first、pred.next等節(jié)點(diǎn)信息

  • 檢查succ是否為空,如果為null,則表示目前的pred節(jié)點(diǎn)就是最后一個了,將last節(jié)點(diǎn)指向pred;反之,如果不為null,則將prev的next節(jié)點(diǎn)指向succ,同時succ的prev節(jié)點(diǎn)指向pred。

  • 最后修改size和modCount的值

上述是往指定位置添加多個元素,那么,往指定位置添加單個元素add(int index, E element)?就變得很簡單了。

方法add(int index, E element)?

該方法包含如下兩個步驟

  • 檢查指定index的值是否有效[0,size]

  • 如果index == size 則使用linkLast添加在尾部;如果index != size, 則使用linkBefore將新元素添加在指定位置之前~

  • linkBefore方法如下

    本文上述已經(jīng)講述了linkLast,linkBefore的方法實現(xiàn)思路類似,這里就不再具體給出解釋了。

    此外,LinkedList還提供了addFirst以及addLast方法,分別用于將元素插在列表頭部和尾部~

    其中,linkFirst和linkLast方法如下:

    ?

    方法 remove 的實現(xiàn)

    LinkedList支持多種刪除元素的方法~

    一起來看看具體是怎么樣的~

    無參數(shù)remove方法

    無參數(shù)的remove方法其實就是調(diào)用了removeFirst方法,也就是移除first元素~

    removeFirst方法

    removeFirst使用了unlinkFirst方法來移除元素~

    unlinkFirst方法處理主要包含如下幾個步驟:

    • 獲取first元素值,然后獲取first的next元素

    • 將first節(jié)點(diǎn)指向next,同時原來的first節(jié)點(diǎn)的屬性值置為null(包括item和next)

    • 如果next節(jié)點(diǎn)(原first節(jié)點(diǎn)的nex節(jié)點(diǎn))為null,則將last置為null值;如果不為null,則將next節(jié)點(diǎn)的prev屬性置為null

    • 然后修正元素個數(shù)以及修改次數(shù)(size和modCount)

    同樣,也存在移除尾節(jié)點(diǎn)的方法removeLast

    removeLast方法

    其使用了unlinkLast方法實現(xiàn)

    unlinked方法的實現(xiàn)與unlinkedFirst的方法思路類似,就不在這里一一說明了~

    方法remove(int index)?

    按照指定位置移除元素,主要包含如下幾個部分:

    • 檢查index是否有效

    • 通過node(index)查找index位置下的節(jié)點(diǎn)

    從上述代碼可以看出,方法node(int index)中

    先判斷index和中間點(diǎn)(size >>1)位置的大小。如果index < (size >> 1), 那么按下標(biāo)從小到大查找;否則,按下標(biāo)從大到小查找~

    • 使用unlink(Node<E> x)修改鏈表的連接關(guān)系,達(dá)到移除元素的效果

    方法remove(Object o)

    按照指定對象的移除,在代碼中,區(qū)分刪除的元素是否為null值,然后從first開始遍歷鏈表,如果元素值和刪除的值內(nèi)容一致,則調(diào)用unlink方法移除元素~

    ?

    方法 indexOf 的實現(xiàn)

    源代碼

    從上述代碼可以看出:

    LinkedList的indexOf實現(xiàn)區(qū)分null和非null值。從first節(jié)點(diǎn)開始遍歷,如果找到符合條件的元素,則返回元素所在的下標(biāo)值。如果沒有找到,則返回-1~

    與之對應(yīng)的還有l(wèi)astIndexOf方法,該方法和indexOf的思路一致,區(qū)別就是,lastIndexOf是以last節(jié)點(diǎn)開始往前尋找~

    ?

    方法 contains 的實現(xiàn)

    源代碼

    從上述代碼可以看出,contains方法內(nèi)調(diào)用了indexOf方法,然后采用獲取的結(jié)果與-1比較,如果不相等表示有匹配的元素,否則表示沒有符合條件的元素~

    ?

    方法 clear 的實現(xiàn)

    源代碼

    clear方法,從first開始遍歷鏈表,將元素的item、prev和nex屬性置為null值,然后將first和last置為null。同時將size置為0,修改次數(shù)加1(modCount+)

    ?

    方法 get 的實現(xiàn)

    LinkedList支持按索引查找以及獲取first和last元素的操作~ 如:

    方法get(int index)的實現(xiàn)

    此方法包含兩個步驟:

  • 檢查指定的index的值是否有效

  • 調(diào)用node(index)獲取節(jié)點(diǎn),返回值node(index).item即可

  • 方法getFirst

    方法getFirst獲取first節(jié)點(diǎn)的值item即可,得先判斷first是否為空~

    方法getLast

    方法getLast獲取last節(jié)點(diǎn)的值item即可,得先判斷l(xiāng)ast是否為空~

    ?

    方法 listIterator 的實現(xiàn)

    源代碼

    其使用了內(nèi)部類ListItr來實現(xiàn),ListItr類內(nèi)容如下:

    listIterator接口繼承自Iterator接口,具備更多的方法,如add,set,previous等等

    ListIterator示例

    輸出結(jié)果:

    ?

    方法descendingIterator的實現(xiàn)

    源代碼

    descendingIterator與Iterator的區(qū)別在于,Iterator是從first開始往后遍歷;而descendingIterator是從last開始往前遍歷;

    Iterator和descendingIterator示例:

    輸出結(jié)果:

    ?

    方法 toArray 的實現(xiàn)

    源代碼

    從first節(jié)點(diǎn)開始,依次遍歷,然后得到一個數(shù)組對象~

    ?

    總結(jié)

    以上是生活随笔為你收集整理的LinkedList 的实现原理浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。