話不多說,直接上源碼
- ArrayList的三種構(gòu)造方式中
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
為什么需要定義兩個(gè)功能相同的變量?
第一個(gè)變量是在指定了默認(rèn)size的時(shí)候,當(dāng)size為0是的初始化成一個(gè)空集合,擴(kuò)容時(shí)按增長方式擴(kuò)容,至于第二個(gè)變量是沒有參數(shù)的構(gòu)造函數(shù)調(diào)用的,目的是為了知道集合在添加元素時(shí),需要擴(kuò)容多少,第二個(gè)應(yīng)該為10,加入第一個(gè)數(shù)值時(shí)才給空間
2.為什么List set操作不修改modCount值呢?
modCount 的作用是快速實(shí)現(xiàn)fail-fast機(jī)制來保證同步變量的,set只是改變了其中的值,而list所關(guān)心的exceptedModCount 并沒有變化,所以對于值的操作無需關(guān)心,只需要關(guān)心迭代器的游標(biāo)是否變化即可
3.Fail-Fast機(jī)制:
每次新建Itr()對象時(shí),都會(huì)保存新建該對象時(shí)對應(yīng)的modCount,這個(gè)值表示List當(dāng)時(shí)的修改次數(shù),但是List可能會(huì)不斷修改的,modCount也在變化,所以以后每次遍歷List中的元素的時(shí)候,都會(huì)比較expectedModCount和modCount是否相等。若不相等,說明List中的元素已經(jīng)發(fā)生了變化,再照之前的狀態(tài)遍歷顯然是不對的,故拋出ConcurrentModificationException異常,產(chǎn)生Fail-Fast事件
4.序列化:
由于 ArrayList 是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,所以并不是所有的空間都被使用。因此使用了 transient 修飾,可以防止被自動(dòng)序列化。所以ArrayList自定義了序列化和反序列化的方法,只序列化被使用的數(shù)據(jù)
5.ensureCapacity:要加入大量的數(shù)據(jù)的時(shí)候,給用戶調(diào)用,以減少增量從新分配的次數(shù)
6.ArrayList 中移除某個(gè)元素,如果不需要?jiǎng)?chuàng)建一個(gè)新的List怎么樣效率最高
推薦用if(list.contains(object)){
list.remove(list.indexof(obejct))
} 這種不需要遍歷,直接刪除