ArrayList
/**
* 默認初始容量.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 用於空實例的共享空數組實例.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 用於默認大小的空實例的共享空數組實例。
* 我們將其與EMPTY_ELEMENTDATA區分開來,以瞭解在添加第一個元素時應該膨脹多少.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 存儲ArrayList元素的數組緩衝區。
* ArrayList的容量是這個數組緩衝區的長度。
* 當添加第一個元素時,任何帶有elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList都將被擴展爲DEFAULT_CAPACITY.
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* ArrayList的大小(它包含的元素的數量).
*
* @serial
*/
private int size;
/**
* add、remove方法直接或間接的都使用了System.arraycopy
* get、set方法是elementData數組的直接操作
*/
LinkedList
transient int size = 0;
/**
* 指向第一個節點.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* 指向最後一個節點.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
/**
* Node<E> 內部類
*/
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;
}
}
/**
* add、remove方法使用了鏈式結構的特性,僅僅修改受影響的添加和刪除相鄰數據
* get、set方法需要先對Node<E>對象進行輪詢查詢或設置值
*/
對比ArrayList和LinkedList
初始長度 | 數據結構 | 效率 | 重複 | 線程安全 | 安全問題 | |
ArrayList | 10 | 動態數組 | get、set快,add、remove慢 | 可以 | 否 | size |
LinkedList | 0 | 雙向鏈表 | add、remove快,get、set慢 | 可以 | 否 | 增刪 |