LinkedList 源碼之我見

接下來要開始手撕LinkedList

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList 繼承自AbstractSequentialList默怨,實現(xiàn)了List Deque Cloneable 實現(xiàn)了序列化质和。
在此之前,先講解一下它所具有的內(nèi)部類Node<E>芯急,我們可以知道這個LinkedList 是用鏈表實現(xiàn)的丘跌,根據(jù)這個內(nèi)部類的實例成員可以看出這是個雙向鏈表剂邮,具有前驅(qū)結(jié)點和后繼結(jié)點距糖。

private void linkFirst(E e)
增加結(jié)點到頭結(jié)點
void linkLast(E e)
增加結(jié)點到尾部結(jié)點
void linkBefore(E e, Node<E> succ)
增加一個結(jié)點到succ之前
private E unlinkLast(Node<E> l)
刪除最后一個
E unlink(Node<E> x)
刪除指定的結(jié)點

這些事LinkedList的私有函數(shù)撤蟆,一般我們調(diào)用的是其在內(nèi)部封裝好的public方法,類似于removeFirst()

public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}

我們從這段代碼中可以看出它其實調(diào)用了unlinkFirst颊艳。unlinkFirst是個private方法就像上面所列舉的方法一樣茅特。我們用的所有基本操作其實全部來自于這些函數(shù)。
基本操作棋枕,我們已經(jīng)很熟了,像什么添加元素到末尾妒峦,添加元素到開頭等等重斑。
我們在這些當(dāng)中,有一個modCount實例成員變量特別突出肯骇,比如它只是增加窥浪,沒有減少。

ConcurrentModificationException()

Iterator 是工作在一個獨立的線程中笛丙,并且擁有一個 mutex 鎖漾脂。 Iterator 被創(chuàng)建之后會建立一個指向原來對象的單鏈索引表,當(dāng)原來的對象數(shù)量發(fā)生變化時胚鸯,這個索引表的內(nèi)容不會同步改變骨稿,所以當(dāng)索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的對象被改變的坦冠。但你可以使用 Iterator 本身的方法 remove() 來刪除對象形耗, Iterator.remove() 方法會在刪除當(dāng)前迭代對象的同時維護(hù)索引的一致性。(來著網(wǎng)上的答案辙浑,我覺得這個還是比較靠譜)激涤。至于fail-fast原則,fail-fast 機(jī)制是java集合(Collection)中的一種錯誤機(jī)制判呕。當(dāng)多個線程對同一個集合的內(nèi)容進(jìn)行操作時倦踢,就可能會產(chǎn)生fail-fast事件。畢竟侠草,這個linkedList不是線程安全的辱挥。vectory為線程安全類∶吻溃或者使用Collections.synchronizedList();方法轉(zhuǎn)化般贼。
而這個觸發(fā)的條件是modCount != expectedModCount。

private class ListItr implements ListIterator<E>
這個expectedModCount是來源于這個Listltr內(nèi)部類奥吩,迭代器內(nèi)部類哼蛆。它內(nèi)部維護(hù)了這個對象,這個對象的時候霞赫,expectedModCount==modCount一般是相等的腮介。

這些代碼重復(fù)的使用了內(nèi)部類,實現(xiàn)了隱藏你不想讓別人知道的操作端衰,也即封裝性叠洗。內(nèi)部類其實還有很多的用處,就留給讀者去探索了旅东。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灭抑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抵代,更是在濱河造成了極大的恐慌腾节,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荤牍,死亡現(xiàn)場離奇詭異案腺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)康吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門劈榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晦嵌,你說我怎么就攤上這事同辣】阶耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵邑闺,是天一觀的道長跌前。 經(jīng)常有香客問我,道長陡舅,這世上最難降的妖魔是什么抵乓? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮靶衍,結(jié)果婚禮上灾炭,老公的妹妹穿的比我還像新娘。我一直安慰自己颅眶,他們只是感情好蜈出,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涛酗,像睡著了一般铡原。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上商叹,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天燕刻,我揣著相機(jī)與錄音,去河邊找鬼剖笙。 笑死卵洗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弥咪。 我是一名探鬼主播过蹂,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聚至!你這毒婦竟也來了酷勺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤扳躬,失蹤者是張志新(化名)和其女友劉穎鸥印,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坦报,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年狂鞋,在試婚紗的時候發(fā)現(xiàn)自己被綠了片择。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡骚揍,死狀恐怖字管,靈堂內(nèi)的尸體忽然破棺而出啰挪,到底是詐尸還是另有隱情,我是刑警寧澤嘲叔,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布亡呵,位于F島的核電站,受9級特大地震影響硫戈,放射性物質(zhì)發(fā)生泄漏锰什。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一丁逝、第九天 我趴在偏房一處隱蔽的房頂上張望汁胆。 院中可真熱鬧,春花似錦霜幼、人聲如沸嫩码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铸题。三九已至,卻和暖如春琢感,著一層夾襖步出監(jiān)牢的瞬間丢间,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工猩谊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留千劈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓牌捷,卻偏偏與公主長得像墙牌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暗甥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容