一、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
- 在鏈表頭添加元素的方法:addFirst、offerFirst、push,在鏈表尾添加元素的方法:add、addLast、offerLast、offer。
- 在鏈表頭刪除元素的方法:(刪除元素的同時會返回所刪除的元素,但有可能元素不存在,即鏈表為空,當(dāng)遇到這種情況時LinkedList提供了兩種處理方式,返回null或者拋出異常),返回null的方法有poll、pollFirst,拋出異常的方法有removeFirst、remove、pop。在鏈表末端刪除元素的方法(末端元素同樣可以不存在,即鏈表為空):返回null的方法有pollLast,拋出異常的方法有removeLast。
- 獲取鏈表頭元素的方法(獲取元素同樣會出現(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。
- ListItr可以向前向后遍歷,還可以增加元素、設(shè)置某個位置的元素。
- DescendingIterator是從鏈表末端向前(單向)遍歷的迭代器,內(nèi)部其實(shí)是封裝了一個ListItr,next方法委托了ListItr的previous方法,hasNext委托了ListItr的hasPrevious方法。
- LLSpliterator是java8并行迭代器的一個實(shí)現(xiàn),此實(shí)現(xiàn)通過trySplit返回一個Spliterators.ArraySpliterator對象,該對象再通過trySplit可把元素分割兩半,然后可以交給多個線程處理。