JAVA ArrayList VS LinkedList 對比之一-背景調查

來源:互聯網
上載者:User

標籤: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 對比之一-背景調查

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.