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

關于ArrayList初始化容量的問題

 更新時間:2023年03月13日 10:27:57   作者:Lframe  
這篇文章主要介紹了關于ArrayList初始化容量的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

ArrayList初始化容量的問題

(所有的圖片的代碼來源于JDK1.8中的源碼)

可能很多同學聽到網上其他人說ArrayList的底層數組elementData的初始化容量是10。

其實并不是!

下圖是我們經常初始化ArrayList使用的構造器:

而DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一個空的數組,請看下面的圖示:

說白了就是,每次我們調用初始化一個空白的集合ArrayList,它的底層數組其實是空的。那人們說的初始化容量是10到底是從哪來的呢?

其實是:當我們第一次為ArrayList添加元素的時候,底層數組擴容到了10。

下面我們就分析一下這個過程

當我們通過ArrayList調用add()方法添加元素的時候,其實底層一共需要調用了4個方法(如果需要擴容的話,則調用5個方法。Math.max()和Arrays.copyOf()不計入其內。)

下面先給出源代碼視圖,然后我們一一分析代碼:

首先假設我們使用

ArrayList<Integer> arrayList = new ArrayList<>();

構造的是一個空的ArrayList,此時ArrayList底層的elementData是一個DEFAULTCAPACITY_EMPTY_ELEMENTDATA(上面有源碼)。

接著調用了ensureCapacityInternal,然后參數size+1,也就是1(size代表我們集合中元素的個數)。

接著調用calculateCapacity(計算容量),通過判斷elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA(也就是判斷我們在初始化ArrayList的時候,是不是使用的是默認的構造器),如果是初始化的時候使用的是默認的狗再去,接著就返回DEFAULT_CAPACITY和上面我們傳的參數中的最大值,而DEFAULT_CAPACITY在源碼就是我們常說的初始化容量10,此時該方法返回DEFAULT_CAPACITY,如果不是使用默認構造器初始化的話,則直接返回我們傳入的參數(也就是我們一開始的size+1)。

到目前為止我們的底層數組elementData的容量仍然是0,并沒有進行擴容,接著調用ensureExplicitCapacity()方法,在該方法內部首先調用modCount++表明此刻在修改ArrayList如果不懂modCount的含義,你可以看我的另一篇文章ArrayList源碼解析, 

里面有講到modCount。接著判斷一下:如果我們傳進來的參數minCapacity(size+1)大于我們當前底層數組elementData的長度(此時為0),則需要擴容,接著調用了grow()方法進行了擴容。

在grow()方法中,首先通過將element的容量擴容至原來的1.5倍(有時是小于1.5倍)(同時這里也是ArrayList的自動擴容機制),接著判斷如果擴容后的容量仍舊小于minCapacity,就把minCapacity作為新容量,否則什么也不做,接著判斷如果新容量大于最大數組容量的話,繼續(xù)調用hugeCapacity()進行擴容(一般調用這個的話會爬出異常),最后通過Arrays.copyOf()進行數組的擴容。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 讓JPA的Query查詢接口返回Map對象的方法

    讓JPA的Query查詢接口返回Map對象的方法

    下面小編就為大家分享一篇讓JPA的Query查詢接口返回Map對象的方法,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java線程休眠_動力節(jié)點Java學院整理

    Java線程休眠_動力節(jié)點Java學院整理

    sleep() 的作用是讓當前線程休眠,即當前線程會從“運行狀態(tài)”進入到“休眠(阻塞)狀態(tài)”。下面通過實例代碼給大家介紹Java線程休眠的知識,需要的朋友參考下吧
    2017-05-05
  • Java大數據開發(fā)Hadoop?MapReduce

    Java大數據開發(fā)Hadoop?MapReduce

    MapReduce的思想核心是“分而治之”,適用于大量復雜的任務處理場景(大規(guī)模數據處理場景)Map負責“分”,即把復雜的任務分解為若干個“簡單的任務”來并行處理??梢赃M行拆分的前提是這些小任務可以并行計算,彼此間幾乎沒有依賴關系
    2023-03-03
  • 解決MyBatis返回結果類型為Boolean的問題

    解決MyBatis返回結果類型為Boolean的問題

    這篇文章主要介紹了解決MyBatis返回結果類型為Boolean的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • java實現上傳文件到服務器和客戶端

    java實現上傳文件到服務器和客戶端

    這篇文章主要為大家詳細介紹了java實現上傳文件到服務器和客戶端,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java實現學生管理系統(tǒng)(控制臺版本)

    Java實現學生管理系統(tǒng)(控制臺版本)

    這篇文章主要為大家詳細介紹了如何利用Java語言實現控制臺版本的學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java實現多線程交替打印兩個數

    java實現多線程交替打印兩個數

    這篇文章主要為大家詳細介紹了java實現多線程交替打印兩個數,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Java?詳細分析四個經典鏈表面試題

    Java?詳細分析四個經典鏈表面試題

    兄弟們,編程,當我們學習完數據結構的時候,你就會有一種豁然開朗的感覺。算是真正的入了編程的門,所以打好數據結構的基礎是特別特別重要的
    2022-03-03
  • java實現租車系統(tǒng)

    java實現租車系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現租車系統(tǒng),以及遇到的兩個問題解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java基于Socket實現HTTP下載客戶端

    Java基于Socket實現HTTP下載客戶端

    這篇文章主要介紹了Java基于Socket實現HTTP下載客戶端的相關資料,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評論

呈贡县| 禄劝| 磐安县| 连云港市| 大田县| 昭通市| 长岭县| 泊头市| 临邑县| 宜兰市| 康平县| 岱山县| 于都县| 特克斯县| 呼和浩特市| 武汉市| 迁安市| 长沙县| 渝中区| 斗六市| 原平市| 宝清县| 大余县| 滁州市| 湘潭县| 余干县| 南通市| 阿拉善左旗| 丹江口市| 浦县| 沅江市| 三门峡市| 天峨县| 松溪县| 山西省| 连云港市| 邯郸县| 洛南县| 商城县| 章丘市| 湟中县|