ArrayList底層操作機制源碼解析
更新時間:2023年09月19日 10:59:36 作者:風過無痕2018
這篇文章主要介紹了ArrayList底層操作機制源碼解析,當創(chuàng)建ArrayList對象時,如果使用的是無參構造器,則初始elementData容量為0,第1次添加,則擴容elementData為10,如需要再次擴容,則擴容elementData為1.5倍,需要的朋友可以參考下
ArrayList 的底層操作機制源碼
擴容機制:
- ArrayList中維護了一個0bject類型的數(shù)組elementData. transient Object[] elementData; //transient表示瞬間,短暫的,表示該屬性不會被序列化
- 當創(chuàng)建ArrayList對象時,如果使用的是無參構造器,則初始elementData容量為0,第1次添加,則擴容elementData為10,如需要再次擴容,則擴容elementData為1.5倍。
- 如果使用的是指定大小的構造器,則初始elementData容量為指定大小,如果需要擴容, 則直接擴容elementData為1.5倍。
debug源碼
- 使用無參構造器,創(chuàng)建和使用ArrayList源碼
/**
* 創(chuàng)建一個空的elementData數(shù)組 = {}
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
} /**
* 執(zhí)行l(wèi)ist.add方法, 先確定是否要擴容,再執(zhí)行添加操作
*/
public boolean add(E e) {
// 每次都要看看是否需要擴容
ensureCapacityInternal(size + 1); //ensureCapacityInternal:確認容量
elementData[size++] = e;
return true;
} /**
* 該方法確定minCapacity , 第一次擴容為10
*/
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
} /**
* modCount:記錄當前集合被修改的次數(shù),如果elementData的容量不夠,就調(diào)用grow方法擴容
*/
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // modCount:記錄當前集合被修改的次數(shù),防止多線程操作出現(xiàn)的異常
if (minCapacity - elementData.length > 0)
// 如果elementData的容量不夠,就調(diào)用grow方法擴容
grow(minCapacity);
} /**
* 真的擴容,使用擴容機制來確定擴容到多大
* 第一次newCapacity為10, 第二次及其以后按照1.5倍擴容
* 擴容的是Arrays.copyOf(), 能保留以前的數(shù)據(jù)
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//(oldCapacity >> 1)的意思是oldCapacity / 2
int newCapacity = oldCapacity + (oldCapacity >> 1); //(1.5倍擴容)
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity; //第一次就是10
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// Arrays.copyOf 將 elementData{} 擴容為newCapacity大小
elementData = Arrays.copyOf(elementData, newCapacity);
}方法一步步返回
- 使用有參構造器,創(chuàng)建和使用ArrayList源碼
/**
* 第一次就按照elementData的1.5倍擴容
* 整個執(zhí)行的流程和前面的無參構造的一樣
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
// 創(chuàng)建了一個指定大小的elementData數(shù)組
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}整個執(zhí)行的流程和無參構造的一樣
到此這篇關于ArrayList底層操作機制源碼解析的文章就介紹到這了,更多相關ArrayList源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解
Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關系,其實就是有一個全局的鍵值對,類型是Map<String, DataSource>,當JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下2024-08-08
基于spring+quartz的分布式定時任務框架實現(xiàn)
在Spring中的定時任務功能,最好的辦法當然是使用Quartz來實現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時任務框架實現(xiàn),有興趣的可以了解一下。2017-01-01
Mybatis?在?insert?插入操作后返回主鍵?id的操作方法
這篇文章主要介紹了Mybatis?在?insert?插入操作后返回主鍵?id的操作方法,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
Java中ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList在這個方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
springboot集成nacos無法動態(tài)獲取nacos配置的問題
這篇文章主要介紹了springboot集成nacos無法動態(tài)獲取nacos配置的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

