java容器詳解一(ArrayList)

1. 底層存儲(chǔ)

  private transient Object[] elementData;
  private int size;

elementData 成員加上了transient關(guān)鍵字,該關(guān)鍵是在該類被序列化和反序列化的時(shí)候不參與,這是因?yàn)榇娣舉lementData是固定數(shù)組,防止沒有存放元素的數(shù)組位置也被序列化,所以使用的自定義的序列化方法。
2. 構(gòu)造方法
夠著方法提供了兩個(gè),一個(gè)默認(rèn)大小為10的數(shù)組,另一個(gè)可以指定大小的數(shù)組
3. 增加和刪除
每次添加元素的時(shí)候都會(huì)檢查容量是否足夠,如果不夠會(huì)擴(kuò)容,擴(kuò)容會(huì)擴(kuò)大原來(lái)的1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

刪除不進(jìn)行縮容,如果數(shù)組進(jìn)行一次大的擴(kuò)容后,后續(xù)只使用了幾個(gè)空間,可以使用

/**
     * 將底層數(shù)組的容量調(diào)整為當(dāng)前實(shí)際元素的大小,來(lái)釋放空間。
     */
    public void trimToSize() {
        modCount++;
       // 當(dāng)前數(shù)組的容量
        int oldCapacity = elementData .length;
       // 如果當(dāng)前實(shí)際元素大小 小于 當(dāng)前數(shù)組的容量,則進(jìn)行縮容
        if (size < oldCapacity) {
            elementData = Arrays.copyOf( elementData, size );
       }

來(lái)縮小容量
4. 總結(jié)
ArrayList內(nèi)部采用固定數(shù)組來(lái)存儲(chǔ)對(duì)象的引用,當(dāng)增加到固定數(shù)組以外時(shí),需要對(duì)數(shù)組進(jìn)行擴(kuò)容,新申請(qǐng)一塊原來(lái)1.5倍大小的內(nèi)存,把原來(lái)的數(shù)組拷貝的新申請(qǐng)的數(shù)組內(nèi)。由此可得,當(dāng)在頻繁增加的場(chǎng)景中,最好一次性的申請(qǐng)足夠大的數(shù)組容量,以免頻繁擴(kuò)容帶來(lái)的時(shí)間開銷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容