Java進階之----LinkedList原始碼分析
阿新 • • 發佈:2019-01-05
這裡要說明一下,Node是LinkedList的內部私有類,它的組成很簡單,只有一個構造方法。// 什麼都沒做,是一個空實現 public LinkedList() { } public LinkedList(Collection<? extends E> c) { this(); addAll(c); } public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } public boolean addAll(int index, Collection<? extends E> c) { // 檢查傳入的索引值是否在合理範圍內 checkPositionIndex(index); // 將給定的Collection物件轉為Object陣列 Object[] a = c.toArray(); int numNew = a.length; // 陣列為空的話,直接返回false if (numNew == 0) return false; // 陣列不為空 Node<E> pred, succ; if (index == size) { // 構造方法呼叫的時候,index = size = 0,進入這個條件。 succ = null; pred = last; } else { // 連結串列非空時呼叫,node方法返回給定索引位置的節點物件 succ = node(index); pred = succ.prev; } // 遍歷陣列,將陣列的物件插入到節點中 for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; } if (succ == null) { last = pred; // 將當前連結串列最後一個節點賦值給last } else { // 連結串列非空時,將斷開的部分連線上 pred.next = succ; succ.prev = pred; } // 記錄當前節點個數 size += numNew; modCount++; return true; }
構造方法的引數順序是:前繼節點的引用,資料,後繼節點的引用。 有了上邊的說明,我們來看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; } }
這段程式碼還是很好理解的。我們可以配合圖片來深入理解。