ArrayList詳解,底層是數組,實現Serializable接口


 

一、對於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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM