【Java學(xué)習(xí)筆記】(十)LinkedList源碼分析(三)

這篇文章來(lái)自我的博客

正文之前

在前面兩篇文章中已經(jīng)講述了 LinkedList 基于列表基于隊(duì)列的操作,這一篇文章作為 LinkedList 系列文章的最后一篇艺智,將會(huì)講述迭代器的用法:

  1. ListItr
  2. DescendingIterator

正文

1. ListItr

  1. 成員變量
  2. 構(gòu)造

在源碼中,ListItr 對(duì)象是私有的菇用,對(duì)象的發(fā)布是通過(guò) listIterator() 方法進(jìn)行的杰刽,關(guān)于對(duì)象的發(fā)布這里不講述,先看看 listIterator() 方法是怎樣的:

    //index是從1開(kāi)始的
    public ListIterator<E> listIterator(int index) {
        //先檢查給出的索引是否有效
        checkPositionIndex(index);
        //返回 ListItr 對(duì)象
        return new ListItr(index);
    }

然后看看 ListItr 類:

    private class ListItr implements ListIterator<E> {}
1. 成員變量
        //當(dāng)前節(jié)點(diǎn)
        private Node<E> lastReturned;
        //下一個(gè)節(jié)點(diǎn)
        private Node<E> next;
        //下一個(gè)節(jié)點(diǎn)的位置
        private int nextIndex;
        private int expectedModCount = modCount;
2. 構(gòu)造
        ListItr(int index) {
            // assert isPositionIndex(index);
            //需要判斷索引是否有效蔫缸,然后確定下一個(gè)節(jié)點(diǎn)
            next = (index == size) ? null : node(index);
            //下一個(gè)節(jié)點(diǎn)的位置
            nextIndex = index;
        }

傳入的參數(shù) index 是從1開(kāi)始的腿准,一試便知:

3. 增

方法中使用到了之前寫(xiě)的基于列表的操作:

        public void add(E e) {
            checkForComodification();
            lastReturned = null;
            //最后一個(gè)節(jié)點(diǎn)
            if (next == null)
                //末尾添加
                linkLast(e);
            else
                //在指定位置添加
                linkBefore(e, next);
            //把下一個(gè)節(jié)點(diǎn)的位置往后移
            nextIndex++;
            expectedModCount++;
        }

        
4. 刪

方法中使用到了之前寫(xiě)的基于列表的操作:

        public void remove() {
            checkForComodification();
            //如果當(dāng)前節(jié)點(diǎn)為空
            if (lastReturned == null)
                throw new IllegalStateException();

            //定義一個(gè)節(jié)點(diǎn),表示當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
            Node<E> lastNext = lastReturned.next;
            //刪除節(jié)點(diǎn)
            unlink(lastReturned);
            if (next == lastReturned)
                next = lastNext;
            else
                nextIndex--;
            //將當(dāng)前節(jié)點(diǎn)設(shè)為null
            lastReturned = null;
            expectedModCount++;
        }
5. 改

將當(dāng)前節(jié)點(diǎn)中的元素改為傳入的參數(shù):

        public void set(E e) {
            //如果節(jié)點(diǎn)為空
            if (lastReturned == null)
                throw new IllegalStateException();
            checkForComodification();
            lastReturned.item = e;
        }
6. 查

迭代器支持雙向操作拾碌,所以能夠向前或向后移動(dòng):

向后移動(dòng):

        //判斷是否有下一個(gè)節(jié)點(diǎn)
        public boolean hasNext() {
            return nextIndex < size;
        }

        public E next() {
            checkForComodification();
            if (!hasNext())
                throw new NoSuchElementException();
            //將下一個(gè)節(jié)點(diǎn)表示為當(dāng)前節(jié)點(diǎn)
            lastReturned = next;
            next = next.next;
            //位置向后移動(dòng)
            nextIndex++;
            //返回當(dāng)前節(jié)點(diǎn)的元素
            return lastReturned.item;
        }

        //返回下一個(gè)節(jié)點(diǎn)的位置
        public int nextIndex() {
            return nextIndex;
        }

向前移動(dòng)吐葱,操作是類似的:

        public boolean hasPrevious() {
            return nextIndex > 0;
        }

        public E previous() {
            checkForComodification();
            if (!hasPrevious())
                throw new NoSuchElementException();
            //向前移,并修改位置
            lastReturned = next = (next == null) ? last : next.prev;
            nextIndex--;
            //返回元素
            return lastReturned.item;
        }

        //同樣是返回位置
        public int previousIndex() {
            return nextIndex - 1;
        }

2. DescendingIterator

反向迭代器對(duì)象的發(fā)布方式也和上面的一樣校翔,通過(guò) descendingIterator() 來(lái)發(fā)布對(duì)象:

    public Iterator<E> descendingIterator() {
        return new DescendingIterator();
    }

    private class DescendingIterator implements Iterator<E> {}

反向迭代器實(shí)現(xiàn)的方法就3個(gè)弟跑,我們先看一眼成員變量:

    private final ListItr itr = new ListItr(size());

其實(shí)反向迭代器是基于 ListItr 來(lái)實(shí)現(xiàn)的,直接在迭代器的初始位置設(shè)置在鏈表的末尾

接下來(lái)來(lái)看看3個(gè)方法:

        public boolean hasNext() {
            return itr.hasPrevious();
        }
        public E next() {
            return itr.previous();
        }
        public void remove() {
            itr.remove();
        }

因?yàn)檫@是反向的展融,所以向前方法的名字還是 next()窖认,但是,是使用了 previous 來(lái)進(jìn)行的

那么告希,有關(guān) LinkedList 的基本用法的源碼就已經(jīng)解讀完畢了扑浸,接下來(lái)會(huì)是其他容器類的源碼解讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市燕偶,隨后出現(xiàn)的幾起案子喝噪,更是在濱河造成了極大的恐慌,老刑警劉巖指么,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝惧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伯诬,警方通過(guò)查閱死者的電腦和手機(jī)晚唇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盗似,“玉大人哩陕,你說(shuō)我怎么就攤上這事。” “怎么了悍及?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵闽瓢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我心赶,道長(zhǎng)扣讼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任缨叫,我火速辦了婚禮椭符,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耻姥。我一直安慰自己艰山,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布咏闪。 她就那樣靜靜地躺著,像睡著了一般摔吏。 火紅的嫁衣襯著肌膚如雪鸽嫂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天征讲,我揣著相機(jī)與錄音据某,去河邊找鬼。 笑死诗箍,一個(gè)胖子當(dāng)著我的面吹牛癣籽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滤祖,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼筷狼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匠童?” 一聲冷哼從身側(cè)響起埂材,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汤求,沒(méi)想到半個(gè)月后俏险,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬绪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年竖独,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤牛。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莹痢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情格二,我是刑警寧澤劈彪,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站顶猜,受9級(jí)特大地震影響沧奴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜长窄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一滔吠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挠日,春花似錦疮绷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至懂算,卻和暖如春只冻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背计技。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工喜德, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垮媒。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓舍悯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親睡雇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萌衬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355