JAVA8 LinkedList源碼學(xué)習(xí)總結(jié)

一、LinkedList是一個雙向鏈表,數(shù)據(jù)結(jié)構(gòu)圖如下(節(jié)點(diǎn)中的數(shù)字為節(jié)點(diǎn)存儲的內(nèi)容):

LinkedList結(jié)構(gòu)

二、LinkedList內(nèi)部有一個Node類,Node類有三個成員變量,分別是item(節(jié)點(diǎn)存儲的內(nèi)容)、prev(指向上一個Node)、next(指向下一個Node)

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

三、LinkedList實(shí)現(xiàn)了List、Queue、Deque(雙端隊(duì)列)接口,有List的特性(有順序、不重復(fù)),支持Queue操作(先進(jìn)后出),支持Deque操作(在隊(duì)首隊(duì)尾插入刪除元素),此外,還提供了push、pop方法,因此還有棧的特性。

四、LinkedList常用API

  1. 在鏈表頭添加元素的方法:addFirst、offerFirst、push,在鏈表尾添加元素的方法:add、addLast、offerLast、offer。
  2. 在鏈表頭刪除元素的方法:(刪除元素的同時會返回所刪除的元素,但有可能元素不存在,即鏈表為空,當(dāng)遇到這種情況時LinkedList提供了兩種處理方式,返回null或者拋出異常),返回null的方法有poll、pollFirst,拋出異常的方法有removeFirst、remove、pop。在鏈表末端刪除元素的方法(末端元素同樣可以不存在,即鏈表為空):返回null的方法有pollLast,拋出異常的方法有removeLast。
  3. 獲取鏈表頭元素的方法(獲取元素同樣會出現(xiàn)鏈表為空的情況):返回null的方法有peek、peekFirst、element,拋出異常的方法有g(shù)etFirst。獲取鏈表末端元素的方法:返回null的方法有peekLast,拋出異常的方法有g(shù)etLast。

五、與ArrayList一樣,有兩個toArray方法,toArray()toArray(T[] a),toArray()返回一個Object[]數(shù)組,toArray(T[] a)返回一個特定類型的數(shù)組。

六、內(nèi)部有3個迭代器類,ListItr、DescendingIterator、LLSpliterator。

  1. ListItr可以向前向后遍歷,還可以增加元素、設(shè)置某個位置的元素。
  2. DescendingIterator是從鏈表末端向前(單向)遍歷的迭代器,內(nèi)部其實(shí)是封裝了一個ListItr,next方法委托了ListItr的previous方法,hasNext委托了ListItr的hasPrevious方法。
  3. LLSpliterator是java8并行迭代器的一個實(shí)現(xiàn),此實(shí)現(xiàn)通過trySplit返回一個Spliterators.ArraySpliterator對象,該對象再通過trySplit可把元素分割兩半,然后可以交給多個線程處理。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容