1. 程式人生 > >java資料結構之:ArrayList與LinkedList詳解

java資料結構之:ArrayList與LinkedList詳解

前篇博文講到了Java底層怎麼知道ArrayList和LinkedList哪個是隨機訪問哪個是順序訪問的,本片博文主要介紹各自的資料特點。 ArrayList: 在這裡插入圖片描述從他的這個建構函式我們可以知道他的底層實現就是一個Object物件陣列。 在這裡插入圖片描述第二個建構函式構造一個空的list預設長度為10 第三個建構函式構造一個包含特定collection集合的list 接下來看一看add方法: public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } ensureCapacityInternal()方法是確保當前資料有位置新增,隨後將資料新增到原元陣列。我們進一步看看ensureCapacityInternal()方法 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } 我們先看方法calculateCapacity()方法 在這裡插入圖片描述

如果說元陣列的容量大小在沒有改變的情況下,那麼很簡單的返回最大的容量值,否則返回當前需要的最小長度。我們再看方法: 在這裡插入圖片描述 當前要求的最小長度減去元陣列當前的長度大於0,說明當前新增元素被要求要擴容元陣列長度。進一步追蹤grow()方法。 在這裡插入圖片描述先是將陣列長度擴大到原來的1.5倍,如果說newCapacity小於當前的最小需求長度則newCapacity等於minCapacity,下面進步一判斷當擴容的大小已經超出最大範圍時,那麼newCapacity就為MAX_ARRAY_SIZE。最後一句話則是將元陣列直接到另一個新的長度為原來1.5倍的陣列中。它的底層實現是本地方法: 在這裡插入圖片描述由於筆者水平有限,暫不討論這一塊,有興趣的讀者可自行研讀。 瞭解了add方法,還有一個我們常用的方法就是它的get方法,我們接著進一步追蹤原始碼: public E get(int index) { rangeCheck(index); return elementData(index); } 可以看到第一句為檢查當前的index是否是合法的(是否超出範圍),第二句則就是直接返回對應索引值下的元數值。

LinkedList 它裡面內建了一個類(node)資料結構。 private static class Node { E item; Node next; Node prev; Node(Node prev, E element, Node next) { this.item = element; this.next = next; this.prev = prev; } } 我們說linkedlist的底層結構實際是一個雙向連結串列。從node結構我們可以看出他有前向“指標”和後向“指標”和元素。接下來我們來trace一下該結構的增刪改查。 add: public boolean add(E e) { linkLast(e); return true; } 1、linkLast() 新增到末尾(尾插)。 前向“指標”為尾節點,後項“指標”為空在這裡插入圖片描述

該方法比較簡單直接是將元素新增到最後,他這裡先得到一惡last節點l,然後構造一個帶元素e的節點newNode,最後插入newNode,size++。 2、其實還包含了頭插法: 在這裡插入圖片描述 final Node newNode = new Node<>(null, e, f);前向“指標”為空,後向“指標”為頭節點。 3、插入到某個非空節點(元素為e)的節點之前。 在這裡插入圖片描述4、remove頭節點 在這裡插入圖片描述5、remove尾節點 在這裡插入圖片描述6、remove任意節點X 在這裡插入圖片描述 根據以上的幾個方法我們基本可以敲定linkedlist這種資料結構。 如有不正確之處,懇請指正,謝謝。