1. 程式人生 > >Java還要再學一遍基礎(七)LinkedList詳解

Java還要再學一遍基礎(七)LinkedList詳解

LinkedList介紹

LinkedList與ArrayList一樣都是屬於AbstractList的子類。但是內部實現與ArrayList不同的是LinkedList是以連結串列的資料結構來實現的,通過引用來指向上一個或者下一個節點。在資料的插入和刪除上面有很高的效率,同時可以被用作佇列,棧或者雙端佇列並提供了對應的操作。

特性:

  • 雙端佇列實現。
  • 執行緒不安全。
  • 插入刪除效率很高。
  • 不能快速隨機訪問(雖然提供了get等方法,但是使用迴圈,效率很低下)

##原始碼分析
1. 類定義

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

繼承AbstractSequentialList(AbstractList的子類),同時實現了List藉口,Deque介面(雙端佇列),Cloneable介面。與ArrayList不同的是沒有繼承RandomAccess介面,因此不能隨機訪問。

  1. 重要屬性
//元素的個數,不能序列化
transient int size = 0;
//第一個節點,不能序列化
transient
Node<E> first; //最後一個節點,不能序列化 transient Node<E> last;

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; } }

其中有兩個引用分別指向上一個節點和下一個節點。

3. 重要的方法
方法部分不不做詳細描述,都是對連結的修改。
get方法:

public E get(int index) {
    checkElementIndex(index);
    return node(index).item;
}

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;
}

雖然說不支援快速隨機訪問,但是還是提供了相應的get方法,用的是暴力迴圈,但是還是根據index的值與size/2的大小縮小了迴圈的範圍,不過效率還是很差。

4. Iterator
LinkedList的Iterator和ArrayList一樣都是有一個Itr實現Iterator介面提供基本的Iterator的功能,同時提供一個ListItr類繼承子Itr實現了ListIterator介面,提供更加更富的功能。
但是從JDK1.6開始同時還提供了DescendingIterator繼承自Iterator介面。提供一個反向遍歷的迭代器:

LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);

for(Iterator<Integer> it = list.descendingIterator(); it.hasNext();)
    System.out.print(it.next() + " ");

輸出:

4 3 2 1 

相關推薦

Java還要基礎LinkedList

LinkedList介紹 LinkedList與ArrayList一樣都是屬於AbstractList的子類。但是內部實現與ArrayList不同的是LinkedList是以連結串列的資料結構來實現的,通過引用來指向上一個或者下一個節點。在資料的插入和刪除上面

Java還要基礎ArrayList

ArrayList概要。 ArrayList是一個容量可變的動態陣列,繼承了AbstractList,並且AbstractList已經實現了一些基本的增刪改查,ListIterator等功能,ArrayList更關注的是內部的的陣列實現。 ArrayList

Java還要基礎hashCode方法

瞭解Java的hashCode方法 hashCode()是什麼? hashCode()方法是Object類中就有的一個方法。 public native int hashCode(); 該方法是native方法,意味著這個方法的實現是依賴於底層

Java還要基礎LinkedHashMap原理

LinkedHashMap概述 LinkedHashMap繼承自HashMap並且實現Map介面,內部雜湊散列表的實現沿用HashMap的功能,同時LinkedHashMap單獨維護了一個雙向連結串列用於記錄插入順序或者訪問順序,以達到按插入順序或者訪問順序迭

Java還要基礎JDK1.8新特性default,static

JDK1.8新特性default,static用法 在1.8以前,我們的Interface之中通常除了抽象方法別的什麼都沒有,但是從1.8引入開始Interface中還可以有具體的實現!其中所要用到的兩個非常重要的關鍵字就是:default和static

Java還要基礎十五獲取Unsafe

Java中的Unsafe被設計成我們不能隨便訪問,雖然也可以通過反射獲取,但是沒有經過嚴格測試的自己寫的程式碼不能保證它的正確性,這裡貼出谷歌api中的Unsafe獲取方法,以備後用:    priva

Java還要基礎WeakHashMap

WeakHashMap概述 WeakHashMap是以弱鍵實現的基於雜湊表的儲存對映資料的Map。當JVM對於這些弱鍵所指向的物件進行了清理回收之後,WeakHashMap會自動有效的將被回收了的對映從map中移除。 引用的相關知識 Java中的引用一共分

Java還要基礎認識java

為什麼選擇Java 公司一個熱衷Python的同事突然問我:你給我說說Java到底有什麼好? 幾番辯論之後我意識到似乎一直以來都忽略的這個問題。網上看了蠻多,記錄一下免得被別人再問到表示很尷尬。

Java還要基礎十六- DelayQueue使用

概述 DelayQueue<E extends Delayed> Delayed 元素的一個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部 是延遲期滿後儲存時間最長的 Delayed 元素。如果延遲都還沒有期滿,則佇列沒有頭部,並且 poll

Java還要基礎十五

概述 初學Java的時候經常都能看到--Java類不能繼承多個類,但是可以實現多個介面。 學了一段時間之後突然發現:原來介面還能繼承介面。 再過一段時間可能終於發現:介面可以繼承多個介面! 其實也是在情理之中,因為Java不支援繼承多個類一定程度上是因為繼承多個類而多個類

ES6--- 陣列的構賦值

解構:ES6按照一定的模式,從陣列和物件中提取值,對變數進行賦值 陣列的結構賦值 形式: 從陣列中提取值,按照對應的位置,對變數賦值 let [a, b, c] = [1, 2, 3] 巢狀資料進行結構 本質上,這種寫法屬於“模式匹配”,只要等號兩邊的

ES6--- 物件的構賦值

解構:ES6按照一定的模式,從陣列和物件中提取值,對變數進行賦值 物件的結構賦值與陣列結構賦值的不同之處:陣列元素時按次序排列的,變數的取值由它的位置決定;物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。 物件的結構賦值 1 形式 let { b

python爬蟲知識點總結PyQuery

get 初始化 span 2個 查看 sel docs lin query 官方學習文檔:http://pyquery.readthedocs.io/en/latest/api.html 一、什麽是PyQuery? 答:強大有靈活的網頁解析庫,模仿jQuery實現。如果你覺

mybatis 原始碼分析KeyGenerator

一、KeyGenerator 概述 在平時開發的時候經常會有這樣的需求,插入資料返回主鍵,或者插入資料之前需要獲取主鍵,這樣的需求在 mybatis 中也是支援的,其中主要的邏輯部分就在 KeyGenerator 中,下面是他的類圖: 其中: NoKeyGenerator:預設空實現,不需要對主鍵單獨處

c++_2014_11_4_基礎

objdump -h main.0// linux下的指令,檢視.o的內容 1.函式引數帶預設值 int sum(int a, int b=0);          r int sum (int a, int b)            r { retur a+b; }(

Linux shell 基礎,自己慢慢步步

Linux shell指令碼基礎學習這部分如果只看前面間的理論部分雖然有一些例子,但是還不夠系統,這裡將以具體例項給大家展現Linux shell指令碼程式設計,以幫助大家完善Linux shell基礎的學習和提高。 第2部分 例項 現在我們來討論編寫一個指令碼的一般步驟。

Java基礎

Java基礎 從入門到放棄 (一)泛型(1)數組直接定義了存儲的類型,防止出現其他類型的元素,集合能不能也像數組一樣,直接規定我們集合的存儲類型,針對這種情況一種技術:泛型<數據類型> --- 引用數據類型 泛型:將明確的集合類型的工作推遲到了創建對象或者調用方法的時候,

Java基礎面試題

Java基礎 面試 從入門到放棄 面試題:Map集合和Collection的區別? Map集合:是一種鍵和值的映射關系(雙列集合) 當作為:夫妻對 Collection集合:單列集合,只能存儲一種類型的元素,當作為:光棍 間接關系:HashSet依賴於Map接口的子實現類HashMap的

Java基礎41LinkedList

serial bst one seq ava col lin 集合 implement   定義 public class LinkedList<E> extends AbstractSequentialList<E> implements Lis

跟我 Java 8 新特性之 Stream 流流與迭代器,流系列大結局

恭喜你們,馬上就要學完Java8 Stream流的一整系列了,其實我相信Stream流對很多使用Java的同學來說,都是一個知識盲點,因為這個原因,我才這麼細緻地講解Stream流的各個知識點,通過這一整個系列,我相信只要認真看了的同學,都已掌握的差不多了,就差實戰了。