ArrayList深度分析疑問

話不多說,直接上源碼
  1. 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))
} 這種不需要遍歷,直接刪除

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容