JDK原始碼閱讀-------自學筆記(二十三)(java.util.LinkedList 初探 自定義講解)
阿新 • • 發佈:2020-09-20
1、LinkedList簡介
- (1) 底層用雙向連結串列實現的儲存
- (2) 查詢效率低,頻繁增刪效率高,執行緒不安全是其主要特點
- (3) 常用單詞Node/Entry表示一個節點,或稱為條項,詞條(形容節點的樣子)
- (4) 連結串列由三部分組成:前一個節點,本節點儲存的資料,後一個節點
2、LinkedList和Collection的關係
3、雙向連結串列Java實現
- (1) 定義一個物件Node,在物件中定義組成節點的三部分:上一個節點、資料位置、下一個節點
- (2) 定義一個連結串列物件,在連結串列物件中操作節點物件.
-
(3) 以add方法為例子:
- 每天執行add()方法的時候,新建一個節點Node,將要新增的元素,放入到Node物件中
- 第一次新增物件的時候,連結串列中是空的,所以,連結串列的第一個節點和最後一個節點都是傳入的Node
- 第二次,開始,新增的物件都存在next當中,以此類推,如圖:
-
形成了類似遞迴的新增方式.
-
4、實戰程式碼
- 實體類Node,建立
1 package com.synway.test.collections.version3.basesimple; 2 3 /** 4 * @author liuyangos8888 5 * @description <p>儲存元素的實體類物件 </p> 6 */ 7 public class Node { 8 9 10 /** 11 * 上一個節點 12 */ 13 Node previous; 14 15 /** 16 * 儲存資料 17 */ 18 Object elements; 19 20 21 /** 22 * 下一個節點 23 */ 24 Node next; 25 26 27 public Node() { 28 29 } 30 31 public Node(Object elements) { 32 this.elements = elements; 33 } 34 35 public Node(Node previous, Object elements, Node next) { 36 this.previous = previous; 37 this.elements = elements; 38 this.next = next; 39 } 40 41 public Node getPrevious() { 42 return previous; 43 } 44 45 public void setPrevious(Node previous) { 46 this.previous = previous; 47 } 48 49 public Object getElements() { 50 return elements; 51 } 52 53 public void setElements(Object elements) { 54 this.elements = elements; 55 } 56 57 public Node getNext() { 58 return next; 59 } 60 61 public void setNext(Node next) { 62 this.next = next; 63 } 64 }
- 連結串列類建立
1 package com.synway.test.collections.version3.basesimple; 2 3 import com.synway.test.collections.version002.methodadd.base.son.AbstractMyCollection; 4 5 import java.util.Iterator; 6 7 /** 8 * @author liuyangos8888 9 * @description <p>自定義一個連結串列<p/> 10 */ 11 public class MyLinkedList { 12 13 /** 14 * 第一個節點 15 */ 16 private Node firstNode; 17 18 19 /** 20 * 最後一個節點 21 */ 22 private Node lastNode; 23 24 25 /** 26 * 連結串列大小 27 */ 28 private int size; 29 30 31 /** 32 * 新增元素 33 * 34 * @param o 傳入的元素 35 */ 36 public void add(Object o) { 37 Node node = new Node(o); 38 39 40 if (firstNode == null) { 41 firstNode = node; 42 } else { 43 node.previous = lastNode; 44 node.next = null; 45 lastNode.next = node; 46 } 47 lastNode = node; 48 } 49 50 51 /** 52 * 新增元素(使用物件set值的方式,更適合java程式設計師理解) 53 * 54 * @param o 傳入的元素 55 */ 56 public void addObject(Object o) { 57 Node node = new Node(); 58 node.setElements(o); 59 60 if (firstNode == null) { 61 firstNode = node; 62 } else { 63 node.setPrevious(lastNode); 64 node.setNext(null); 65 lastNode.setNext(node); 66 } 67 68 lastNode = node; 69 } 70 71 72 @Override 73 public String toString() { 74 StringBuilder stringBuilder = new StringBuilder(); 75 stringBuilder.append("["); 76 77 Node temp = firstNode; 78 79 while (temp != null) { 80 stringBuilder.append(temp.elements).append(","); 81 temp = temp.next; 82 } 83 84 stringBuilder.setCharAt(stringBuilder.length() - 1, ']'); 85 86 return stringBuilder.toString(); 87 } 88 89 }
- 新增方法說明
一般add方法寫法
1 /** 2 * 新增元素 3 * 4 * @param o 傳入的元素 5 */ 6 public void add(Object o) { 7 Node node = new Node(o); 8 9 10 if (firstNode == null) { 11 firstNode = node; 12 } else { 13 node.previous = lastNode; 14 node.next = null; 15 lastNode.next = node; 16 } 17 lastNode = node; 18 }
View Code 適合java開發理解檢視的寫法
1 /** 2 * 新增元素(使用物件set值的方式,更適合java程式設計師理解) 3 * 4 * @param o 傳入的元素 5 */ 6 public void addObject(Object o) { 7 Node node = new Node(); 8 node.setElements(o); 9 10 if (firstNode == null) { 11 firstNode = node; 12 } else { 13 node.setPrevious(lastNode); 14 node.setNext(null); 15 lastNode.setNext(node); 16 } 17 18 lastNode = node; 19 }
View Code - 測試
一般add方法寫法測試
1 package com.synway.test.version003; 2 3 import com.synway.test.collections.version3.basesimple.MyLinkedList; 4 5 public class TestLinkedList { 6 7 public static void main(String[] args) { 8 9 MyLinkedList myLinkedList = new MyLinkedList(); 10 myLinkedList.add("a"); 11 myLinkedList.add("b"); 12 myLinkedList.add("c"); 13 System.out.println(myLinkedList.toString()); 14 15 }
View Code 適合java開發理解檢視的寫法測試
1 package com.synway.test.version003; 2 3 import com.synway.test.collections.version3.basesimple.MyLinkedList; 4 5 public class TestLinkedList { 6 7 public static void main(String[] args) { 8 9 MyLinkedList myLinkedList2 = new MyLinkedList(); 10 myLinkedList2.addObject("a"); 11 myLinkedList2.addObject("b"); 12 myLinkedList2.addObject("c"); 13 myLinkedList2.addObject("e"); 14 myLinkedList2.addObject("f"); 15 System.out.println(myLinkedList2.toString()); 16 17 } 18 }
View Code
- 實體類Node,建立