標籤:java 原始碼
API 地址:http://docs.oracle.com/javase/6/docs/api/
涉及概念之間的關係如下:
圖解:
List 是一個介面,它繼承於Collection的介面。它代表著有序的隊列。它允許重複的元素。
AbstractList 是一個抽象類別,它繼承於AbstractCollection。AbstractList實現List介面中除size()、get(int location)之外的函數。
AbstractSequentialList 是一個抽象類別,它繼承於AbstractList。它的方法較少。專門為LinkedList而設計。
ArrayList, LinkedList, Vector, Stack是List的4個實作類別。
背景一:
ArrayList 通過一個Object[]數組儲存物件,要注意這個數組是transient類型的。它的add()和remove()方法是通過System.arraycopy(...)實現的,get()方法就是返回數組的一個元素。
AbstractSequentialList 進一步地實現了add()、get()以及remove()方法。它通過調用ListIterator類中相應的方法實現這些方法。這樣的目的是通過雙向列表的特性,提高執行速度。它把listIterator(int index)方法聲明為abstract類型,要求使用者必須重新實現。
LinkedList 繼承自AbstractSequentialList,通過一個雙向鏈表格儲存體對象。注意這個鏈表的header是transient類型的。這裡的header中是不包含實際資料的,僅僅作為鏈表的前端節點。它的add()、get()、remove()方法就是對雙向鏈表的操作。它通過雙向鏈表地特性,重新實現了listIterator(int index)方法,定義內嵌的ListIterator類。
背景二:
ArrayList 是一個可改變大小的數組.當更多的元素加入到ArrayList中時,其大小將會動態地增長.內部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質上就是一個數組.
LinkedList 是一個雙鏈表,在添加和刪除元素時具有比ArrayList更好的效能.但在get與set方面弱於ArrayList.
原始碼初探:
ArrayList 原始碼摘要:
// size, isEmpty, get, set, iterator, 和listIterator 等操作都是常量時間.add操作也接近常量時間。ArrayList執行個體都有一個屬性:capacity. capacity至少和size一樣大,它是自動成長的。它表示ArrayList可以存放的元素數目。
private static final int DEFAULT_CAPACITY = 10; //預設capacity.
private static final Object[] EMPTY_ELEMENTDATA = {};//capacity 就是這個 array buffer的大小private transient Object[] elementData; //這就是arraylist最主要的元素:數組。
public void ensureCapacity(int minCapacity) ;//這個方法以及之後的一系列方法都是用來操作capacity 的,它們可以讓capacity 增長。
private void grow(int minCapacity) //這個方法展示了每次擴容擴多少,基本上相當於:newCapacity = oldCapacity + (oldCapacity >> 1);
public int indexOf(Object o) //順序尋找對象。線性時間
public E get(int index) //索引擷取對象。常量時間
public E set(int index, E element)//線性時間
public boolean add(E e) //相當於線性時間
public void add(int index, E element) //插入,線性時間
public E remove(int index) //刪除,線性時間
JAVA ArrayList VS LinkedList 對比之一-背景調查