91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ArrayList初始化容量的問題如何解決

發布時間:2023-03-13 11:52:06 來源:億速云 閱讀:81 作者:iii 欄目:開發技術

這篇“ArrayList初始化容量的問題如何解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“ArrayList初始化容量的問題如何解決”文章吧。

ArrayList初始化容量的問題

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

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

其實并不是!

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

ArrayList初始化容量的問題如何解決

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

ArrayList初始化容量的問題如何解決

說白了就是,每次我們調用初始化一個空白的集合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代表我們集合中元素的個數)。

ArrayList初始化容量的問題如何解決

接著調用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()方法進行了擴容。

ArrayList初始化容量的問題如何解決

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

ArrayList初始化容量的問題如何解決

以上就是關于“ArrayList初始化容量的問題如何解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彰化市| 右玉县| 郸城县| 卓资县| 田林县| 新邵县| 汝南县| 石嘴山市| 沙田区| 曲阳县| 县级市| 疏附县| 商南县| 甘南县| 天水市| 佳木斯市| 渭南市| 中西区| 霍城县| 大洼县| 汝州市| 佛坪县| 焉耆| 方正县| 项城市| 修文县| 洛南县| 广宁县| 原阳县| 河北区| 淳化县| 中牟县| 浮梁县| 无锡市| 正蓝旗| 桂林市| 黑山县| 定边县| 林口县| 克拉玛依市| 和政县|