Java LinkedList指南

1. 介紹

LinkedList是一個雙向鏈表, 實現了ListDeque接口。它實現全部可選的list操做,而且存儲對象能夠爲nulljava

2. 特色

LinkedList具備如下特色:數組

  • 查到列表中的元素,須要從頭到尾的遍歷列表
  • 沒有同步
  • 它的IteratorListIterator迭代器是快速失敗的(這意味着在迭代器建立以後,若是修改了列表,將拋出一個ConcurrentModificationException)
  • 每一個元素都是一個節點,它保留對下一個和前一個節點的引用
  • 維護了插入順序

雖然LinkedList沒有同步,可是咱們能夠經過調用Collections.synchronizedList方法建立它的同步版本,如:微信

List list = Collections.synchronizedList(new LinkedList(...));

3. 與ArrayList比較

雖然它們都實現了List接口,但它們具備不用的語義,這將影響咱們使用哪個。數據結構

3.1 結構體

ArrayList是基於索引的數據結構,它提供了對其元素的隨機訪問,其性能爲O(1)。性能

LinkedList將數據存儲爲元素列表,而且每一個元素都連接到上一個和下一個元素。在這樣狀況下,其元素搜索的復發度爲O(n)。指針

3.2 操做

LinkedList中的元素進行插入,刪除操做更快,由於當元素添加到集合內的某個位置時,不須要調整數組的大小或更新索引,只需更改先後元素的prenext指針便可。code

3.3 內存的使用狀況

LinkedList的內存佔用比ArrayList更多,由於在每個接口都須要存儲兩個引用,一個用於記錄前一個元素,一個用於記錄後一個元素。而ArrayList中僅須要保持數據和它的索引。對象

4. 用法

如下是一些代碼示例,展現瞭如何使用LinkedList索引

4.1 建立

LinkedList<Object> linkedList = new LinkedList<>();

4.2 添加元素

LinkedList實現了ListDeque接口,除了標準的add()addAll(),還提供了addFirst()addLast(),它們分別在開頭或結尾添加一個元素。接口

4.3 刪除元素

與元素添加相似,LinkedList還提供了removeFirst()removeLast()

此外,還有方便的方法removeFirstOccurence()removeLastOccurence()返回boolean。若是collection中包含了指定的元素,則返回true

4.4 隊列操做

Deque接口提供相似隊列的行爲(實際上Deque擴展了Queue接口):

linkedList.poll();
linkedList.pop();

這些方法檢索第一個元素並將其從列表中刪除。
poll()pop()的區別是當列表爲空時,pop就會拋出NoSuchElementException()異常,而poll則會返回null

linkedList.push(Object o);

push將在列表頭添加一個元素。

LinkedList還有許多其餘操做,使用方式與ListDeque同樣。

5. 結論

ArrayList一般是默認的List實現。

可是,在某些使用狀況下,使用LinkedList會是更好的選擇。例如須要頻繁的插入,刪除,更新列表元素時。


Author :笑笑粑粑
曾用網名:TinyKing
微信公衆號:Java碼農
知乎專欄: 愛笑笑愛分享
我的博客: 愛笑笑,愛生活 自我評價: 一個愛好普遍的CRUD程序猿 ^_^
相關文章
相關標籤/搜索