Java集合·03·LinkedList詳解

一、概述

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

LinkedList 實(shí)現(xiàn) List 接口舌稀,能對(duì)它進(jìn)行隊(duì)列操作啊犬。

LinkedList 實(shí)現(xiàn) Deque 接口,即能將LinkedList當(dāng)作雙端隊(duì)列使用壁查。

LinkedList 實(shí)現(xiàn)了Cloneable接口觉至,即覆蓋了函數(shù)clone(),能克隆睡腿。

LinkedList 實(shí)現(xiàn)java.io.Serializable接口语御,這意味著LinkedList支持序列化峻贮,能通過(guò)序列化去傳輸。

LinkedList 是非同步的。

AbstractSequentialList

AbstractSequentialList 實(shí)現(xiàn)了“鏈表中魄藕,根據(jù)index索引值操作鏈表的全部函數(shù)”藏研。

實(shí)現(xiàn)了與index相關(guān)接口

  • get(int): E
  • set(int, E): E
  • add(int, E): void
  • remove(int, E): E
  • addAll(int, Collection<? extends E>):boolean

限定只返回ListIterator

AbstractSequentialList使用Iterator實(shí)現(xiàn)了這些隨機(jī)訪問(wèn)接口,減少隨機(jī)訪問(wèn)對(duì)于具體數(shù)據(jù)結(jié)構(gòu)的依賴嚼黔。如果想要自定義隨機(jī)訪問(wèn)方式,可以繼承AbstractList惜辑。

二唬涧、數(shù)據(jù)結(jié)構(gòu)

鏈表

Node - 雙向鏈表節(jié)點(diǎn)類,一般來(lái)說(shuō)包括previous引用盛撑、next引用碎节、element

size - 節(jié)點(diǎn)個(gè)數(shù)

    transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

與之前版本修改點(diǎn):header拆分成兩個(gè)first+last,之前只有一個(gè)header使用index判斷是否是邊界抵卫,使用first+last只需要判斷prev==null||next==null就可以了狮荔。

三、特點(diǎn)

  • 順序訪問(wèn)效率高介粘、隨機(jī)訪問(wèn)效率低
  • 隨機(jī)添加/隨機(jī)刪除元素效率高
  • 無(wú)限容量

四殖氏、實(shí)現(xiàn)要點(diǎn)

1. 雙向鏈表的索引值實(shí)現(xiàn)

隨機(jī)訪問(wèn)

遍歷尋找,根據(jù)size選擇比較近的一端開(kāi)始遍歷姻采。復(fù)雜度為O(N/2)

LinkedList中所有隨機(jī)訪問(wèn)都是先通過(guò)node(int)得到Node雅采,然后再對(duì)Node進(jìn)行操作。

    /**
     * Returns the (non-null) Node at the specified element index.
     */
    Node<E> node(int index) {
        // assert isElementIndex(index);

        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

定位(indexOf(E))

遍歷實(shí)現(xiàn)

public int indexOf(Object o) {
    int index = 0;
    if (o == null) {
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null)
                return index;
            index++;
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item))
                return index;
            index++;
        }
    }
    return -1;
}

2. 基本功能的實(shí)現(xiàn)

AbstractSequentialList已實(shí)現(xiàn)方法add()慨亲、remove()婚瓜、get() ,依然保留刑棵,使用Iterator實(shí)現(xiàn)AbstractSequentialList未實(shí)現(xiàn)方法巴刻,Node元素操作直接修改next、prev引用對(duì)象來(lái)實(shí)現(xiàn)蛉签,索引操作先找到Node元素冈涧,再進(jìn)行操作。

拋棄元素時(shí)需要設(shè)置各項(xiàng)為null正蛙,保證對(duì)象可以被gc掉

    E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

3. Iterator/DescendingIterator實(shí)現(xiàn)

自定義了ListItr<E>繼承自ListIterator<E>

成員變量:

        private Node<E> lastReturned = null;
        private Node<E> next;
        private int nextIndex;
        private int expectedModCount = modCount;

使用方式:類同ArrayList

fast-fail機(jī)制:類同ArrayList

DescendingIterator:從size開(kāi)始向前調(diào)用

4. Deque雙端隊(duì)列

由于LinkedList實(shí)現(xiàn)了Deque督弓,而Deque接口定義了在雙端隊(duì)列兩端訪問(wèn)元素的方法。提供插入乒验、移除和檢查元素的方法愚隧。每種方法都存在兩種形式:一種形式在操作失敗時(shí)拋出異常,另一種形式返回一個(gè)特殊值(null 或 false,具體取決于操作)狂塘。

方法總結(jié)

第一個(gè)元素(頭部) 最后一個(gè)元素(尾部)
拋出異常 特殊值 拋出異常 特殊值
插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)
移除 removeFirst() pollFirst() removeLast() pollLast()
檢查 getFirst() peekFirst() getLast() peekLast()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末录煤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荞胡,更是在濱河造成了極大的恐慌妈踊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泪漂,死亡現(xiàn)場(chǎng)離奇詭異廊营,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)萝勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門露筒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人敌卓,你說(shuō)我怎么就攤上這事慎式。” “怎么了趟径?”我有些...
    開(kāi)封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瘪吏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蜗巧,道長(zhǎng)肪虎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任惧蛹,我火速辦了婚禮,結(jié)果婚禮上刑枝,老公的妹妹穿的比我還像新娘香嗓。我一直安慰自己,他們只是感情好装畅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布靠娱。 她就那樣靜靜地躺著,像睡著了一般掠兄。 火紅的嫁衣襯著肌膚如雪像云。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天蚂夕,我揣著相機(jī)與錄音迅诬,去河邊找鬼。 笑死婿牍,一個(gè)胖子當(dāng)著我的面吹牛侈贷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播等脂,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俏蛮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撑蚌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起搏屑,我...
    開(kāi)封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤争涌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辣恋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體亮垫,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抑党,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了包警。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡底靠,死狀恐怖害晦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暑中,我是刑警寧澤壹瘟,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站鳄逾,受9級(jí)特大地震影響稻轨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雕凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一殴俱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚抵,春花似錦线欲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逼泣,卻和暖如春趴泌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拉庶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工嗜憔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氏仗。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓痹筛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帚稠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 夏天到了谣旁,許多同學(xué)都想和水來(lái)個(gè)親密接觸,但最近溺水事件頻頻發(fā)生滋早,所以我們才需要學(xué)預(yù)防溺水的措施榄审、自救方法等許多防溺...
    劉亮_aba1閱讀 2,031評(píng)論 0 0
  • 昨晚一時(shí)興致看了一會(huì)子綜藝,看到了由韓雪杆麸,徐帆搁进,賈靜雯,馬思純演繹的金陵十三釵昔头。尤其喜歡那段秦淮景饼问,咿咿呀呀帶著吳...
    桃子西瓜閱讀 763評(píng)論 4 4
  • 你能知道你走后留給我一個(gè)背影剩下我一個(gè)人孤獨(dú)的滋味嗎?
    回首的背叛閱讀 76評(píng)論 0 1
  • 閱讀時(shí)間:5分鐘 關(guān)鍵詞:醫(yī)療行業(yè)內(nèi)情、就診誤區(qū)讹开、就診準(zhǔn)備 段子:一個(gè)男人走進(jìn)診所盅视,告訴醫(yī)生說(shuō)他很不舒服。醫(yī)生給他...
    無(wú)限個(gè)無(wú)限閱讀 325評(píng)論 0 0
  • 好幾年前的四月天旦万,我應(yīng)朋友之邀闹击,去一個(gè)叫桃花溪的地方參加一個(gè)某地區(qū)的散文筆會(huì),其實(shí)我那時(shí)才學(xué)涂鴉沒(méi)幾年成艘,是沒(méi)有資格...
    讓思想有家閱讀 956評(píng)論 0 0