最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ArrayList底層操作機(jī)制源碼解析

 更新時間:2023年09月19日 10:59:36   作者:風(fēng)過無痕2018  
這篇文章主要介紹了ArrayList底層操作機(jī)制源碼解析,當(dāng)創(chuàng)建ArrayList對象時,如果使用的是無參構(gòu)造器,則初始elementData容量為0,第1次添加,則擴(kuò)容elementData為10,如需要再次擴(kuò)容,則擴(kuò)容elementData為1.5倍,需要的朋友可以參考下

ArrayList 的底層操作機(jī)制源碼

擴(kuò)容機(jī)制:

  • ArrayList中維護(hù)了一個0bject類型的數(shù)組elementData. transient Object[] elementData; //transient表示瞬間,短暫的,表示該屬性不會被序列化
  • 當(dāng)創(chuàng)建ArrayList對象時,如果使用的是無參構(gòu)造器,則初始elementData容量為0,第1次添加,則擴(kuò)容elementData為10,如需要再次擴(kuò)容,則擴(kuò)容elementData為1.5倍。
  • 如果使用的是指定大小的構(gòu)造器,則初始elementData容量為指定大小,如果需要擴(kuò)容, 則直接擴(kuò)容elementData為1.5倍。

debug源碼

  • 使用無參構(gòu)造器,創(chuàng)建和使用ArrayList源碼
    /**
     * 創(chuàng)建一個空的elementData數(shù)組 = {}
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
   /**
	* 執(zhí)行l(wèi)ist.add方法, 先確定是否要擴(kuò)容,再執(zhí)行添加操作
	*/
    public boolean add(E e) {
    	// 每次都要看看是否需要擴(kuò)容
        ensureCapacityInternal(size + 1); //ensureCapacityInternal:確認(rèn)容量
        elementData[size++] = e;
        return true;
    }
   /**
	* 該方法確定minCapacity , 第一次擴(kuò)容為10
	*/
   private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { 
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
    }
   /**
	* modCount:記錄當(dāng)前集合被修改的次數(shù),如果elementData的容量不夠,就調(diào)用grow方法擴(kuò)容
	*/
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++; // modCount:記錄當(dāng)前集合被修改的次數(shù),防止多線程操作出現(xiàn)的異常
        if (minCapacity - elementData.length > 0) 
        	// 如果elementData的容量不夠,就調(diào)用grow方法擴(kuò)容
            grow(minCapacity);
    }
   /**
	* 真的擴(kuò)容,使用擴(kuò)容機(jī)制來確定擴(kuò)容到多大
	* 第一次newCapacity為10, 第二次及其以后按照1.5倍擴(kuò)容
	* 擴(kuò)容的是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倍擴(kuò)容)
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity; //第一次就是10
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // Arrays.copyOf 將 elementData{} 擴(kuò)容為newCapacity大小
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

方法一步步返回

  • 使用有參構(gòu)造器,創(chuàng)建和使用ArrayList源碼
   /**
	* 第一次就按照elementData的1.5倍擴(kuò)容
	* 整個執(zhí)行的流程和前面的無參構(gòu)造的一樣
	*/
    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í)行的流程和無參構(gòu)造的一樣

到此這篇關(guān)于ArrayList底層操作機(jī)制源碼解析的文章就介紹到這了,更多相關(guān)ArrayList源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot配置動態(tài)數(shù)據(jù)源的實(shí)戰(zhàn)詳解

    SpringBoot配置動態(tài)數(shù)據(jù)源的實(shí)戰(zhàn)詳解

    Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關(guān)系,其實(shí)就是有一個全局的鍵值對,類型是Map<String, DataSource>,當(dāng)JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下
    2024-08-08
  • 基于spring+quartz的分布式定時任務(wù)框架實(shí)現(xiàn)

    基于spring+quartz的分布式定時任務(wù)框架實(shí)現(xiàn)

    在Spring中的定時任務(wù)功能,最好的辦法當(dāng)然是使用Quartz來實(shí)現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時任務(wù)框架實(shí)現(xiàn),有興趣的可以了解一下。
    2017-01-01
  • java同步與異步的學(xué)習(xí)筆記整理

    java同步與異步的學(xué)習(xí)筆記整理

    在本篇文章里小編給大家整理了關(guān)于java同步與異步的學(xué)習(xí)筆記整理內(nèi)容,需要的朋友們參考下。
    2020-02-02
  • Java?awt-對話框簡單實(shí)現(xiàn)方式

    Java?awt-對話框簡單實(shí)現(xiàn)方式

    這篇文章主要介紹了Java?awt-對話框簡單實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mybatis?在?insert?插入操作后返回主鍵?id的操作方法

    Mybatis?在?insert?插入操作后返回主鍵?id的操作方法

    這篇文章主要介紹了Mybatis?在?insert?插入操作后返回主鍵?id的操作方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Java中ArrayList和LinkedList的區(qū)別

    Java中ArrayList和LinkedList的區(qū)別

    ArrayList和LinkedList在這個方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 以實(shí)例講解Objective-C中的KVO與KVC機(jī)制

    以實(shí)例講解Objective-C中的KVO與KVC機(jī)制

    這篇文章主要介紹了以實(shí)例講解Objective-C中的KVO與KVC機(jī)制,即Key-Value-Observing與Key-Value-Coding,需要的朋友可以參考下
    2015-09-09
  • java selenium處理Iframe中的元素示例

    java selenium處理Iframe中的元素示例

    本文主要介紹java selenium處理Iframe中的元素,這里整理了相關(guān)資料并附有示例代碼和實(shí)現(xiàn)方法,有需要的小伙伴可以參考下
    2016-08-08
  • 詳解Spring Boot2 Webflux的全局異常處理

    詳解Spring Boot2 Webflux的全局異常處理

    這篇文章主要介紹了詳解Spring Boot2 Webflux的全局異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • springboot集成nacos無法動態(tài)獲取nacos配置的問題

    springboot集成nacos無法動態(tài)獲取nacos配置的問題

    這篇文章主要介紹了springboot集成nacos無法動態(tài)獲取nacos配置的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

新平| 昌都县| 淮北市| 囊谦县| 察雅县| 漳平市| 庆安县| 阿克陶县| 牟定县| 马公市| 姜堰市| 建水县| 永善县| 山丹县| 汤阴县| 蒙城县| 定日县| 巴彦县| 罗城| 怀远县| 伊宁市| 凭祥市| 银川市| 青神县| 龙陵县| 常州市| 广东省| 临沂市| 郁南县| 平顺县| 洪江市| 凭祥市| 禹城市| 金坛市| 内江市| 绥中县| 静乐县| 阳朔县| 巴里| 麻江县| 额济纳旗|