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的容量不夠,就調用grow方法擴容 */ private void ensureExplicitCapacity(int minCapacity) { modCount++; // modCount:記錄當前集合被修改的次數(shù),防止多線程操作出現(xiàn)的異常 if (minCapacity - elementData.length > 0) // 如果elementData的容量不夠,就調用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源碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別分析
這篇文章主要介紹了JDBC的基本操作與Statement和PreparedStateMent使用區(qū)別,Java Database Connectivity,它是代表一組獨立于任何數(shù)據(jù)庫管理系統(tǒng)(DBMS)的API,聲明在java.sql與javax.sql包中,是SUN(現(xiàn)在Oracle)提供的一組接口規(guī)范2023-04-04Spring Boot中使用AOP統(tǒng)一處理web層異常的方法
這篇文章主要介紹了Spring Boot中使用AOP統(tǒng)一處理web層異常的相關資料,需要的朋友可以參考下2018-03-03springboot 配置DRUID數(shù)據(jù)源的方法實例分析
這篇文章主要介紹了springboot 配置DRUID數(shù)據(jù)源的方法,結合實例形式分析了springboot 配置阿里DRUID數(shù)據(jù)源的具體步驟與相關操作技巧,需要的朋友可以參考下2019-12-12springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能
這篇文章主要介紹了springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java Spring @Autowired的這些騷操作,你都知道嗎
這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09