三、連結串列 —— LinkedList
ArrayList 雖然好用,但是陣列和陣列列表都有一個重大的缺陷:從陣列的中間位置刪除一個元素要付出很大的代價,其原因是陣列中處於被刪除元素之後的所有元素都要向陣列的前端移動。但是,具有連結串列結構的 LinkedList 則沒有這個問題。
LinkedList 的底層結構是類似資料結構裡邊的雙向連結串列,可以代價比較小地實現元素的增加和刪除。
LinkedList 有一個如上圖的內部類,這個類就是實現了雙向連結串列的功能。
1、構造方法
LinkedList()
Constructs an empty list. 構造方法沒什麼特殊的。
2、常用方法
1)add 方法
預設新增元素到連結串列的最後一位
1 LinkedList<String> list = new LinkedList<>(); 2 //----- 新增操作 ---- 3 list.add("1"); 4 list.add("2"); 5 list.add("3"); 6 7 // 將 "4" 新增到第一個位置 8 list.add(0, "4");
2)addFirst、removeFirst 和 getFirst 方法
分別為將元素新增到第一個位置,刪除第一個位置的元素,獲取第一個位置的元素
System.out.println("\nTest \"addFirst(), removeFirst(), getFirst()\""); // 將 "10" 新增到第一個位置 list.addFirst("10"); System.out.println("list: " + list); // 將第一個元素刪除 System.out.println("list.removeFirst(): " + list.removeFirst()); System.out.println("list: " + list); // 獲取第一個元素 System.out.println("list.getFirst(): " + list.getFirst());
結果為:
Test "addFirst(), removeFirst(), getFirst()" list: [10, 4, 1, 2, 3] list.removeFirst(): 10 list: [4, 1, 2, 3] list.getFirst(): 4
3)offerFirst、pollFirst 和 peekFirst 方法
比上面的上個方法多了個返回值
System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\""); // 將 "10" 新增到第一個位置,返回 true System.out.println(list.offerFirst("10")); System.out.println("list: " + list); // 將第一個元素刪除,失敗則返回 null System.out.println("list.pollFirst(): " + list.pollFirst()); System.out.println("list: " + list); // 獲取第一個元素,失敗則返回 null System.out.println("list.peekFirst(): " + list.peekFirst());
結果為:
Test "offerFirst(), pollFirst(), peekFirst()" true list: [10, 4, 1, 2, 3] list.pollFirst(): 10 list: [4, 1, 2, 3] list.peekFirst(): 4
4)addLast、removeLast 和 getLast 方法
分別為新增一個元素到最後一個位置,刪除最後一個位置的元素以及獲取最後一個位置的元素
System.out.println("\nTest \"addLast(), removeLast(), getLast()\""); // 將 "20" 新增到最後一個位置 list.addLast("20"); System.out.println("list: " + list); // 將最後一個元素刪除 System.out.println("list.removeLast(): " + list.removeLast()); System.out.println("list: " + list); // 獲取最後一個元素 System.out.println("list.getLast(): " + list.getLast());
結果為:
Test "addLast(), removeLast(), getLast()" list: [4, 1, 2, 3, 20] list.removeLast(): 20 list: [4, 1, 2, 3] list.getLast(): 3
5)offerLast、pollLast 和 peekLast 方法
同理,比上面的方法多個返回值
System.out.println("\nTest \"offerLast(), pollLast(), peekLast()\""); // 將 "20" 新增到第一個位置,返回 true list.offerLast("20"); System.out.println("list: " + list); // 將第一個元素刪除,失敗則返回 null System.out.println("list.pollLast(): " + list.pollLast()); System.out.println("list: " + list); // 獲取第一個元素,失敗則返回 null System.out.println("list.peekLast(): " + list.peekLast());
結果為:
Test "offerLast(), pollLast(), peekLast()" list: [4, 1, 2, 3, 20] list.pollLast(): 20 list: [4, 1, 2, 3] list.peekLast(): 3
6)set 和 get 方法
// 將第 3 個元素設定為 300,不建議在 LinkedList 中使用此操作,因為效率低 list.set(2, "300"); // 獲取第 3 個元素,不建議在 LinkedList 中使用此操作,因為效率低 System.out.println("\nget(2): " + list.get(2)); System.out.println("list: " + list);
結果為:
get(2): 300
list: [4, 1, 300, 3]
7)toArray 方法
有兩個實現:toArray(), toArray(T[] a)
第二個不需要進行強制型別轉換,而且轉換後的陣列長度和 a 的長度有關,小於等於 list 的 size,則返回 list 的元素,大於則補 null
// 將 LinkedList 轉換為陣列 String[] arr = list.toArray(new String[list.size()]); for (String str : arr) { System.out.println("str: " + str); }
結果為:
str: 4 str: 1 str: 300 str: 3
如果引數陣列長度大於 list 的 size,則返回 null
// 將 LinkedList 轉換為陣列 String[] arr = list.toArray(new String[list.size() + 5]); for (String str : arr) { System.out.println("str: " + str); }
結果為:
str: 4 str: 1 str: 300 str: 3 str: null str: null str: null str: null str: null
8)size、clear 和 isEmpty 方法
// 輸出大小 System.out.println("size: " + list.size()); // 清空 LinkedList list.clear(); // 判斷 LinkedList 是否為空 System.out.println("isEmpty(): " + list.isEmpty() + "\n");
結果為:
size: 4 isEmpty(): true
特別感謝:
1、Java 集合系列 05 之 LinkedList 詳細介紹 (原始碼解析) 和使用示例
2、《Core Java Volume I》