天天看點

掌握LinkedList的原理及應用

前面一節介紹了ArrayList,本節介紹LinkedList。LinkedList也是List接口的實作類,與ArrayList不同之處是采用的存儲結構不同,ArrayList的資料結構為線性表,而LinkedList資料結構是連結清單。連結清單資料結構的特點是每個元素配置設定的空間不必連續、插入和删除元素時速度非常快、但通路元素的速度較慢。

LinkedList是一個雙向連結清單, 當資料量很大或者操作很頻繁的情況下,添加和删除元素時具有比ArrayList更好的性能。但在元素的查詢和修改方面要弱于ArrayList。LinkedList類每個結點用内部類Node表示,LinkedList通過first和last引用分别指向連結清單的第一個和最後一個元素,當連結清單為空時,first和last都為NULL值。LinkedList資料結構如下圖所示:

掌握LinkedList的原理及應用

LinkedList類内部的Node結點代碼如下:

掌握LinkedList的原理及應用

Node節點一共有三個屬性:item代表節點值,prev代表節點的前一個節點,next代表節點的後一個節點。每個結點都有一個前驅和後繼結點,并且在 LinkedList中也定義了兩個變量分别指向連結清單中的第一個和最後一個結點。

transient

Node first;

transient

Node last;

1、添加元素到LinkedList

LinkedList提供了多個添加元素的方法:

●boolean add(E e)

在連結清單尾部添加一個元素,如果成功,傳回true,否則傳回false。

●void addFirst(E e)

在連結清單頭部插入一個元素。

●addLast(E e)

在連結清單尾部添加一個元素。

●void add(int index, E element)

在指定位置插入一個元素。

添加元素到LinkedList示例代碼如下:

掌握LinkedList的原理及應用

代碼通過add、addFirst、addLast方法加入元素,并通過println輸對外連結表元素。輸出結果如下圖所示:

掌握LinkedList的原理及應用

圖 14-12 LinkedListAddDemo輸出結果

2、從LinkedList中删除元素

LinkedList提供了多個删除元素的方法:

●boolean remove(Object o)

從目前連結清單中移除指定的元素。

● E remove(int index)

從目前連結清單中移除指定位置的元素。

● E removeFirst()

從目前連結清單中移除第一個元素。

● E removeLast()

從目前連結清單中移除最後一個元素。

● E remove()

從目前連結清單中移除第一個元素,同removeLast()相同。

從LinkedList删除元素示例代碼如下:

掌握LinkedList的原理及應用

代碼通過add方法加入元素,再通過remove、removeFirst、removeLast等方法移除元素,并通過println輸出操作後的連結清單元素。輸出結果如下圖所示:

掌握LinkedList的原理及應用

3、從LinkedList中擷取元素

LinkedList提供了多個擷取元素的方法:

● E get(int index)

從目前連結清單中擷取指定位置的元素。

● E getFirst()

從目前連結清單中擷取第一個元素。

● E getLast()

從目前連結清單中擷取最後一個元素。

從LinkedList擷取元素示例代碼如下:

掌握LinkedList的原理及應用

代碼通過add方法加入元素,再通過get、getFirst、getLast方法擷取元素,并通過println輸出操作後的連結清單元素。輸出結果如下圖所示:

掌握LinkedList的原理及應用

4、LinkedList的周遊方法

同前面介紹的集合類周遊方式一樣,LinkedList可以通過疊代器、foreach語句、for循環語句等方法周遊集合的所有元素。

周遊LinkedList元素示例代碼如下:

掌握LinkedList的原理及應用

代碼采用for循環、疊代器、foreach方式,周遊包含10萬個元素的LinkedList,通過輸出結果可以看出,foreach語句效率最高,其次是疊代器,效率最差的是for循環。輸出結果如下圖所示:

掌握LinkedList的原理及應用

■ 知識點撥

LinkedList存儲元素的資料結構是雙向連結清單結構,由存儲元素的結點連接配接而成,每一個節點都包含前一個節點的引用,後一個節點的引用和節點存儲的值。當一個新節點插入時,隻需要修改其中保持先後關系的節點的引用即可。