java LinkedList (詳解)


Java 鏈表(LinkedList)

 

一、鏈表簡介

1、鏈表 (Linked List) 是一種常見的基礎數據結構,是一種線性表,但是鏈表不會按線性表的順序存儲數據,而是每個節點里存到下一個節點的地址

2、它是一個隊列,可以當雙端隊列來使用

3、它是一個集合,可以根據索引隨機訪問集合中的元素,還實現了Deque接口

4、LinedList是一個List集合,它的實現方式和ArrayList是完全不同的,ArrayList的底層是通過一個動態的Object[]數組實現的,而LinkedList的底層是通過鏈表來實現的,因此它的隨機訪問速度是比較差的,但是它的刪除,插入操作很快

5、LinkedList是基於雙向循環鏈表實現的,除了可以當作鏈表操作外,它還可以當作棧、隊列和雙端隊列來使用。

6、LinkedList同樣是非線程安全的,只在單線程下適合使用

 

鏈表可以分為單向鏈表雙向鏈表循環鏈表

 

單向鏈表

一個單向鏈表包含兩個值:當前節點的值和一個指向下一個節點的鏈接。

 

 

雙向鏈表

一個雙向鏈表有三個值:數值、向前節點鏈接、向后節點鏈接。

 

循環鏈表

頭節點和尾節點被連接在一起的鏈表稱為循環鏈表,這種方式在單向和雙向鏈表中皆可實現。循環鏈表中第一個節點之前就是最后一個節點,反之亦然。

  LinkedList(鏈表)類似於ArrayList,是一種常用的數據容器。

 與 ArrayList 相比,LinkedList 的增加和刪除的操作效率更高,而查找和修改的操作效率較低。

 

以下情況使用 ArrayList :

 

  • 頻繁訪問列表中的某一個元素。
  • 只需要在列表末尾進行添加和刪除元素操作。

 

以下情況使用 LinkedList :

 

  • 你需要通過循環迭代來訪問列表中的某些元素。
  • 需要頻繁的在列表開頭、中間、末尾等位置進行添加和刪除元素操作。

二、LinkedList類

  • LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。
  • LinkedList 實現 List 接口,能進行列表的相關操作。
  • LinkedList 實現了 Queue 接口,可作為隊列使用。
  • LinkedList 實現 Deque 接口,即能將LinkedList當作雙端隊列使用。
  • LinkedList 實現了Cloneable接口,即覆蓋了函數clone(),能克隆。
  • LinkedList 實現java.io.Serializable接口,這意味着LinkedList支持序列化,能通過序列化去傳輸。
  • LinkedList 是非同步的。

 


LinkedList 類位於 java.util 包中,使用前需要引入它,語法格式如下:

1 // 引入 LinkedList 類
2 import java.util.LinkedList; 3 
4 LinkedList<E> list = new LinkedList<E>();   // 普通創建方法
5 或者 6 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合創建鏈表

 

三、常用的方法

public boolean add(E e) 鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。
public void add(int index, E element) 向指定位置插入元素。
public boolean addAll(Collection c) 將一個集合的所有元素添加到鏈表后面,返回是否成功,成功為 true,失敗為 false。
public boolean addAll(int index, Collection c) 將一個集合的所有元素添加到鏈表的指定位置后面,返回是否成功,成功為 true,失敗為 false。
public void addFirst(E e) 元素添加到頭部。
public void addLast(E e) 元素添加到尾部。
public boolean offer(E e) 向鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。
public boolean offerFirst(E e) 頭部插入元素,返回是否成功,成功為 true,失敗為 false。
public boolean offerLast(E e) 尾部插入元素,返回是否成功,成功為 true,失敗為 false。
public void clear() 清空鏈表。
public E removeFirst() 刪除並返回第一個元素。
public E removeLast() 刪除並返回最后一個元素。
public boolean remove(Object o) 刪除某一元素,返回是否成功,成功為 true,失敗為 false。
public E remove(int index) 刪除指定位置的元素。
public E poll() 刪除並返回第一個元素。
public E remove() 刪除並返回第一個元素。
public boolean contains(Object o) 判斷是否含有某一元素。
public E get(int index) 返回指定位置的元素。
public E getFirst() 返回第一個元素。
public E getLast() 返回最后一個元素。
public int indexOf(Object o) 查找指定元素從前往后第一次出現的索引。
public int lastIndexOf(Object o) 查找指定元素最后一次出現的索引。
public E peek() 返回第一個元素。
public E element() 返回第一個元素。
public E peekFirst() 返回頭部元素。
public E peekLast() 返回尾部元素。
public E set(int index, E element) 設置指定位置的元素。
public Object clone() 克隆該列表。
public Iterator descendingIterator() 返回倒序迭代器。
public int size() 返回鏈表元素個數。
public ListIterator listIterator(int index) 返回從指定位置開始到末尾的迭代器。
public Object[] toArray() 返回一個由鏈表元素組成的數組。
public T[] toArray(T[] a) 返回一個由鏈表元素轉換類型而成的數組。

 

四、代碼示例

 常用方法演示:

 1 import java.util.LinkedList;  2 
 3 public class LinkedListTest {  4     public static void main(String[] args) {  5         //引入LinkedList類
 6         LinkedList<String> lList = new LinkedList<String>();  7 
 8         //添加元素
 9         lList.add("hello"); 10         lList.add("world"); 11         lList.add("java"); 12         lList.add("LinkedList"); 13 
14         //鏈表元素個數
15  System.out.println(lList.size()); 16         //getFirst()方法獲取頭部元素
17         System.out.println(lList.getFirst()); //hello 18         //addFirst() 在頭部添加元素
19         lList.addFirst("the");  //[the, hello, world, java, LinkedList]
20  System.out.println(lList); 21         //addLast() 在尾部添加元素
22         lList.addLast("ArrayList"); //[the, hello, world, java, LinkedList, ArrayList]
23  System.out.println(lList); 24         // removeFirst() 移除頭部元素
25         lList.removeFirst();  // [hello, world, java, LinkedList, ArrayList] 26         // set(int index, E element) 指定元素替換指定位置的元素
27         lList.set(1,"the"); //[hello, the, java, LinkedList, ArrayList]
28  System.out.println(lList); 29         // add( int index,E element) 指定位置插入元素
30         lList.add(2,"world"); //[hello, the, world, java, LinkedList, ArrayList]
31  System.out.println(lList); 32         // for-each 迭代元素
33         System.out.println("for-each 迭代元素:"); 34         for (String s : lList){ 35  System.out.println(s); 36  } 37  } 38 }

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM