1. 程式人生 > 其它 >JAVA系列集合之-ArrayList

JAVA系列集合之-ArrayList

1. ArrayList 簡介

  • ArrayList 是個陣列,但是可自動擴容的動態陣列。和普通的陣列相比,它的容量能夠動態的增長,預設大小為10,每次插入資料的時候都會比較插入資料後和陣列長度的大小,如果陣列長度小則擴容0.5倍。
  • ArrayList繼承了AbstractList、實現了List、RandomAccess、Cloneable、Serializable介面
    • 繼承了List的介面並且實現了AbstractList,ArrayList就有了增、刪、改、查、判空、迭代器等功能
    • 實現了RandomAccess介面則能夠實現快速訪問(RandomAccess基礎的介面沒有任何方法的時間,就是標記實現類是否具備快速訪問的特性)
    • 實現了Cloneable介面則說明ArrayList支援Object的clone的方法,如果不繼承呼叫clone方法會丟擲CloneNotSupportedException的錯誤,看了下原始碼,是native方法實現的
    • 實現了Serializable介面則說明ArrayList能夠被序列化和反序列化,能夠在網路中進行傳輸
  • 從ArrayList的原始碼中可以看到,沒有任何鎖的新增,所以ArrayList是非執行緒安全的,對應的執行緒安全的實現類是Vector,此種類型的資料會在接下來的文章有有所介紹。

2.Arraylist的資料結構

ArrayList的繼承關係:

java.lang.Object
   ↳     java.util.AbstractCollection
<E> ↳ java.util.AbstractList<E> ↳ java.util.ArrayList<E> public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {}

ArrayList與Collection的關係如下圖:(此圖來源於網路)

ArrayList兩個屬性是最重要的

  • elementData:本質是Object[]陣列,在預設的構造器中,會將初始化的值設定為10,同時也提供了構造器去初始化容量的大小,但它是個動態陣列,elementData陣列的大小會根據ArrayList的容量的增長而動態的增長。
  • size:動態陣列的實際大小

3.ArrayList的集中遍歷方式

ArrayList支援3種遍歷方式:

  • 第一種:通過隨機訪問讀取
ArrayList<Integer> list = new ArrayList();
Integer value = null; int size = list.size(); for (int i=0; i<size; i++) { value = (Integer)list.get(i); }
  • 第二種:通過for迴圈遍歷(進行檔案編譯後實質也是迭代器的實現)
ArrayList<Integer> list = new ArrayList();
Integer value = null;
for (Integer integ:list) {
  value = integ;
}
  • 第三種:通過迭代器進行遍歷,即 Iterator去遍歷 
ArrayList<Integer> list = new ArrayList();
Integer value = null; Iterator iter = list.iterator(); while (iter.hasNext()) { value = (Integer)iter.next(); }

4.ArrayList的總結

  • ArrayList實際上是用陣列去儲存資料,陣列的預設長度是10,陣列資料的插入,內部的動態資料會擴容
  • 擴容機制:newCapacity = oldCapacity/2 + 1
  • ArrayList實現Serializable,當寫入到輸出時候,先寫入容量,在一次寫入每一個數據,當讀取輸入的時候,先讀取容量,在一次讀取每一個數據