一、對於ArrayList需要掌握的七點內容
ArrayList的創建:即構造器
往ArrayList中添加對象:即add(E)方法
獲取ArrayList中的單個對象:即get(int index)方法
刪除ArrayList中的對象:即remove(E)方法
遍歷ArrayList中的對象:即iterator,在實際中更常用的是增強型的for循環去做遍歷
判斷對象是否存在於ArrayList中:contain(E)
ArrayList中對象的排序:主要取決於所采取的排序算法(以后講)
二、源碼分析
2.1、ArrayList的創建(常見的兩種方式)
List<String> strList = new ArrayList<String>();
List<String> strList2 = new ArrayList<String>(2);
ArrayList源代碼:
基本屬性:
//對象數組:ArrayList的底層數據結構
private transient Object[] elementData;
//elementData中已存放的元素的個數,注意:不是elementData的容量
private int size;
注意:
transient關鍵字的作用:在采用Java默認的序列化機制的時候,被該關鍵字修飾的屬性不會被序列化。
ArrayList類實現了java.io.Serializable接口,即采用了Java默認的序列化機制
上面的elementData屬性采用了transient來修飾,表明其不使用Java默認的序列化機制來實例化,但是該屬性是ArrayList的底層數據結構,在網絡傳輸中一定需要將其序列化,之后使用的時候還需要反序列化,那不采用Java默認的序列化機制,那采用什么呢?直接翻到源碼的最下邊有兩個方法,發現ArrayList自己實現了序列化和反序列化的方法
View Code
構造器:
/**
* 創建一個容量為initialCapacity的空的(size==0)對象數組
*/
public ArrayList(int initialCapacity) {
super();//即父類protected AbstractList() {}
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity:" + initialCapacity);
this.elementData = new Object[initialCapacity];
}
/**
* 默認初始化一個容量為10的對象數組
*/
public ArrayList() {
this(10);//即上邊的public ArrayList(int initialCapacity){}構造器
}
在我們執行new ArrayList<String>()時,會調用上邊的無參構造器,創造一個容量為10的對象數組。
在我們執行new ArrayList<String>(2)時,會調用上邊的public ArrayList(int initialCapacity),創造一個容量為2的對象數組。
注意:
上邊有參構造器的super()方法是ArrayList父類AbstractList的構造方法,這個構造方法如下,是一個空構造方法:
protected AbstractList() {
}
在實際使用中,如果我們能對所需的ArrayList的大小進行判斷,有兩個好處:
節省內存空間(eg.我們只需要放置兩個元素到數組,new ArrayList<String>(2))
避免數組擴容(下邊會講)引起的效率下降(eg.我們只需要放置大約37個元素到數組,new ArrayList<String>(40))
2.2、往ArrayList中添加對象(常見的兩個方法add(E)和addAll(Collection<? extends E> c))
