簡介:
LinkedList是List接口的實現類【存儲結構是鏈表,特點:每個元素分配的空間不必連續、插入和刪除元素時速度非常快、但訪問元素的速度較慢】
ArrayList 也是List接口的實現類【存儲結構是線性表】
LinkedList 是一個雙向鏈表,當數據量很大或者操作很頻繁的情況下,添加和刪除元素時具有比ArrayList更好的性能。但在元素查詢和修改方便要弱於ArrayList。LinkedList類每個結點用內部類Node表示,LInkedList通過first和last引用分別只想鏈表的第一個和最后一個元素,當鏈表為空時,first和last都為NULL值。LinkedList數據結構如下圖所示:
//存儲對象的結構Node,LinkedList的內部類 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; } }
Node節點一共有三個屬性:item代表節點值,prev代表節點的前一個節點,next代表節點的后一個節點。每個節點都有一個前驅和后繼結點,並且在LinkedList中也定義了兩個變量分別指向鏈表的第一個和最后一個節點。
transient Node<E> first;
transient Node<E> last;
1、添加元素到LinkedList
LinkedList提供了多個添加元素的方法;
- Boolean add(E e) :在鏈表尾部添加一個元素,如果成功,返回true,否則返回false。
- void addFirst(E e):在鏈表頭部插入一個元素。
- addLast(E e): 在鏈表尾部 插入一個元素。
- void add(int index,E element): 在指定位置插入一個元素。
添加元素到LinkedList示例代碼如下:

package addDemo; import java.util.LinkedList; public class LinkedListAddDemo{ public static void main(String[] args){ LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("first"); linkedList.add("second"); linkedList.add("third"); System.out.println(linkedList); linkedList.addFirst("addFirst"); System.out.println(linkedList); linkedList.addLast("addLast"); System.out.println(linkedList); linkedList.add(2,"addByIndex"); System.out.println(linkedList); } }
輸出結果如下:
從LinkedList中刪除元素
LinkedList提供了多個刪除元素的方法:
- boolean remove(Object o):從當前鏈表中移除指定的元素。
- E remove(int Index):從當前鏈表中移除指定位置的元素
- E removeFirst(): 從當前鏈表中移除第一個元素。
- E removeLast():從當前鏈表中移除最后一個元素。
- E remove() :從當前鏈表中移除第一個元素,同removeLast()相同。
從LinkedList刪除元素示例代碼如下:

import java.util.LinkedList; public class test{ public static void main(String[] args) { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("first"); linkedList.add("second"); linkedList.add("escond"); linkedList.add("third"); linkedList.add("four"); linkedList.add("five"); System.out.println(linkedList); linkedList.remove(); System.out.println("remove:"+linkedList); linkedList.remove("second"); System.out.println("remove(Object):"+linkedList); linkedList.remove("six"); System.out.println("remove(Object) not exist:"+linkedList); linkedList.remove(2); System.out.println("remove(index):"+linkedList); linkedList.removeFirst(); System.out.println("removeFirst:"+linkedList); linkedList.removeLast(); System.out.println("removeLast:"+linkedList); System.out.println("------------------------------------"); linkedList.clear(); linkedList.add("first"); linkedList.add("second"); linkedList.add("escond"); linkedList.add("third"); linkedList.add("four"); linkedList.add("five"); System.out.println(linkedList); linkedList.removeFirstOccurrence("first"); System.out.println("removeFirstOccurrence"+linkedList); linkedList.removeLastOccurrence("first"); System.out.println("removeLastOccurrence"+linkedList); } }
輸出結果如下:
從LinkedList獲取元素示例代碼如下:
LinkedList提供了多個獲取元素的方法:
- E get(int index):從當前鏈表中獲取指定位置的元素。
- E getFirst():從當前鏈表中獲取第一個元素。
- E getLast():從當前鏈表中獲取最后一個元素。

import java.util.LinkedList; public class test{ public static void main(String[] args) { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("first"); linkedList.add("second"); linkedList.add("escond"); linkedList.add("third"); linkedList.add("four"); linkedList.add("five"); System.out.println(linkedList); linkedList.get(3); System.out.println("get(index)"+linkedList.get(3)); linkedList.getLast(); System.out.println("getLast"+linkedList.getLast(); linkedList.getFirst(); System.out.println("getFirst"+linkedList.getFirst(); } }
輸出結果如下圖所示:
LinkedList的長度
int size() 獲取LinkedList的長度
LInkedList的遍歷方法
LinkedList可以通過迭代器、foreach語句、for循環語句等方法遍歷集合的所有元素。

import java.util.Iterator; import java.util.LinkedList; public class test{ public static void main(String[] args) { LinkedList<Integer> linkedList = new LinkedList<>(); for(int i=0;i<10000;i++){ linkedList.addLast(i); } //通過一般for循環來遍歷LinkedList long start = System.currentTimeMillis(); int size = linkedList.size(); for(int i=0;i<size;i++){ linkedList.get(i); } long end = System.currentTimeMillis(); long total = end-start; System.out.println("byCommonFor-------->"+total+" ms"); //通過迭代器來遍歷LinkedList start = System.currentTimeMillis(); for(Iterator iter = linkedList.iterator();iter.hasNext();) iter.next(); end = System.currentTimeMillis(); total = end - start; System.out.println("byIterator--------->"+total+" ms"); //通過foreach來遍歷LinkedList start = System.currentTimeMillis(); for (Integer integer : linkedList) ; end = System.currentTimeMillis(); total = end-start; System.out.println("byForeach--------->"+total+" ms"); } }
輸出結果如下圖所示:
LInkedList 存儲元素的數據結構是雙向鏈表結構,由存儲元素的結點連接而成,每一個節點都包含前一個節點的引用,后一個節點的引用和節點存儲的值。當一個新節點插入時,只需要修改其中保持先后關系的節點的引用即可。