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

關(guān)于ArrayList初始化容量的問(wèn)題

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

ArrayList初始化容量的問(wèn)題

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

可能很多同學(xué)聽到網(wǎng)上其他人說(shuō)ArrayList的底層數(shù)組elementData的初始化容量是10。

其實(shí)并不是!

下圖是我們經(jīng)常初始化ArrayList使用的構(gòu)造器:

而DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一個(gè)空的數(shù)組,請(qǐng)看下面的圖示:

說(shuō)白了就是,每次我們調(diào)用初始化一個(gè)空白的集合ArrayList,它的底層數(shù)組其實(shí)是空的。那人們說(shuō)的初始化容量是10到底是從哪來(lái)的呢?

其實(shí)是:當(dāng)我們第一次為ArrayList添加元素的時(shí)候,底層數(shù)組擴(kuò)容到了10。

下面我們就分析一下這個(gè)過(guò)程

當(dāng)我們通過(guò)ArrayList調(diào)用add()方法添加元素的時(shí)候,其實(shí)底層一共需要調(diào)用了4個(gè)方法(如果需要擴(kuò)容的話,則調(diào)用5個(gè)方法。Math.max()和Arrays.copyOf()不計(jì)入其內(nèi)。)

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

首先假設(shè)我們使用

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

構(gòu)造的是一個(gè)空的ArrayList,此時(shí)ArrayList底層的elementData是一個(gè)DEFAULTCAPACITY_EMPTY_ELEMENTDATA(上面有源碼)。

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

接著調(diào)用calculateCapacity(計(jì)算容量),通過(guò)判斷elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA(也就是判斷我們?cè)诔跏蓟疉rrayList的時(shí)候,是不是使用的是默認(rèn)的構(gòu)造器),如果是初始化的時(shí)候使用的是默認(rèn)的狗再去,接著就返回DEFAULT_CAPACITY和上面我們傳的參數(shù)中的最大值,而DEFAULT_CAPACITY在源碼就是我們常說(shuō)的初始化容量10,此時(shí)該方法返回DEFAULT_CAPACITY,如果不是使用默認(rèn)構(gòu)造器初始化的話,則直接返回我們傳入的參數(shù)(也就是我們一開始的size+1)。

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

里面有講到modCount。接著判斷一下:如果我們傳進(jìn)來(lái)的參數(shù)minCapacity(size+1)大于我們當(dāng)前底層數(shù)組elementData的長(zhǎng)度(此時(shí)為0),則需要擴(kuò)容,接著調(diào)用了grow()方法進(jìn)行了擴(kuò)容。

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

    讓JPA的Query查詢接口返回Map對(duì)象的方法

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

    Java線程休眠_(dá)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

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

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

    解決MyBatis返回結(jié)果類型為Boolean的問(wèn)題

    這篇文章主要介紹了解決MyBatis返回結(jié)果類型為Boolean的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • java實(shí)現(xiàn)上傳文件到服務(wù)器和客戶端

    java實(shí)現(xiàn)上傳文件到服務(wù)器和客戶端

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

    Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)(控制臺(tái)版本)

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

    java實(shí)現(xiàn)多線程交替打印兩個(gè)數(shù)

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

    Java?詳細(xì)分析四個(gè)經(jīng)典鏈表面試題

    兄弟們,編程,當(dāng)我們學(xué)習(xí)完數(shù)據(jù)結(jié)構(gòu)的時(shí)候,你就會(huì)有一種豁然開朗的感覺。算是真正的入了編程的門,所以打好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)是特別特別重要的
    2022-03-03
  • java實(shí)現(xiàn)租車系統(tǒng)

    java實(shí)現(xiàn)租車系統(tǒng)

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

    Java基于Socket實(shí)現(xiàn)HTTP下載客戶端

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

最新評(píng)論

贺州市| 闽清县| 高唐县| 灵丘县| 佛学| 治多县| 视频| 保山市| 霍邱县| 区。| 石台县| 遵义县| 德令哈市| 仙居县| 应城市| 皮山县| 铁力市| 阿巴嘎旗| 阿瓦提县| 大兴区| 苏尼特左旗| 巴塘县| 潮安县| 安远县| 论坛| 革吉县| 甘德县| 九寨沟县| 马龙县| 宣汉县| 余姚市| 古浪县| 萍乡市| 南涧| 湘潭县| 石台县| 舒兰市| 吴忠市| 丰顺县| 清水县| 林甸县|