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

溫馨提示×

溫馨提示×

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

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

JDK1.8中ArrayList是怎么擴容的

發布時間:2021-12-14 09:15:18 來源:億速云 閱讀:218 作者:iii 欄目:開發技術

本篇內容主要講解“JDK1.8中ArrayList是怎么擴容的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JDK1.8中ArrayList是怎么擴容的”吧!

ArrayList簡介:

ArrayList實現了List接口它是一個可調整大小的數組可以用來存放各種形式的數據。并提供了包括CRUD在內的多種方法可以對數據進行操作但是它不是線程安全的,外ArrayList按照插入的順序來存放數據。

在講擴容機制之前,我們需要了解一下ArrayList中最主要的幾個變量:

private static final int DEFAULT_CAPACITY = 10;//數組默認初始容量

private static final Object[] EMPTY_ELEMENTDATA = {};//定義一個空的數組實例以供其他需要用到空數組的地方調用 

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//定義一個空數組,跟前面的區別就是這個空數組是用來判斷ArrayList第一添加數據的時候要擴容多少。默認的構造器情況下返回這個空數組 

transient Object[] elementData;//數據存的地方它的容量就是這個數組的長度,同時只要是使用默認構造器(DEFAULTCAPACITY_EMPTY_ELEMENTDATA )第一次添加數據的時候容量擴容為DEFAULT_CAPACITY = 10 

private int size;//當前數組的長度

本題的所有的講解都是基于JDK8

JDK1.8中ArrayList是怎么擴容的

這道題考察了ArrayList的構造器和對擴容機制的了解,本篇博客基于此出發講解ArrayList的擴容機制

想要做出這道題必須了解ArrayList的構造函數,ArrayList的構造函數總共有三個:

  • ArrayList()構造一個空的數組。JDK7中構造一個初始容量為10的空列表但是JDK8中只是構造一個空的數組

  • ArrayList(Collection<? extends E> c)構造一個包含指定 collection 的元素的數組,這些元素是按照該 collection 的迭代器返回它們的順序排列的。

  • ArrayList(int initialCapacity)構造一個具有指定初始容量的空數組。

我們重點來看這兩個ArrayList(int initialCapacity)ArrayList()構造函數

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

初始化一個空數組,這是JDK8不同于之前版本的地方

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

對于形參initialCapacity判斷,如果大于0那么就聲明一個和形參一樣大小的數組。了解到這里似乎這道題的正確答案也出來了即選擇A,并沒有發生擴容

但是作為一名合格的程序員要有探索精神,題目提到了擴容,既然ArrayList底層是一個數組,那么就肯定會滿,什么時候發生擴容呢?

//1.add方法為添加元素在數組末尾
public boolean add(E e) {
    //確保數組容量 size指向數組的末尾
    ensureCapacityInternal(size + 1);
    //在完成添加之前要確保數組長度足夠
    elementData[size++] = e;
    return true;
}
//3.elementData為ArrayList底層維護的數組,minCapacity為此時數組的大小
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    //如果數組為初始化的值,就初始化數組容量為10(空參的構造方法下首次添加)
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}
//2.minCapacity表示此時數組的大小
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//4.minCapacity表示此時數組的大小
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    //如果此時數組容量的大小不夠就擴容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

源碼讀到這里,我們明白了,當我們每次向ArrayList添加元素的時候,都會首先確保數組容量夠放下元素如果不夠就會 grow(minCapacity)調用擴容函數,那么秉承著探索的精神,原本大小的數組擴容之后變成多大了呢?還得繼續看源碼

//擴容源碼
private void grow(int minCapacity) {
    //獲取當前數組的長度
    int oldCapacity = elementData.length;
    //>>右移相當于整除2,新容量相當于就舊容量的1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    //如果擴容后的容量還不夠那么就以需要的容量為新容量
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    //如果新容量已經超過最大容量了,那么就直接使用最大容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    //講新容量的數組拷貝
    elementData = Arrays.copyOf(elementData, newCapacity);
}

源碼大致讀完后,我們明白了ArrayList的自動擴容機制,每次新添加元素的時候都會判斷是否能夠容下,如果不夠就會發生擴容,擴容的大小為原大小的1.5倍數,明白這些以后讓我們看看下面這段程序擴容了幾次呢??容量是多少呢?

ArrayList<Integer> arrayList = new ArrayList<Integer>(20);
for(int i=1;i<=50;i++) {
     arrayList.add(i);
}

前20次添加不會發生擴容,當21元素添加時數組容量從20擴容到30,當添加31元素時數組容量從30擴容到45,當添加46元素時數組容量從45擴容到67

到此,相信大家對“JDK1.8中ArrayList是怎么擴容的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

运城市| 巴楚县| 渝北区| 那坡县| 方正县| 宿州市| 新兴县| 漳平市| 汽车| 麻栗坡县| 渝中区| 微山县| 屏边| 安图县| 四会市| 吉木乃县| 宁津县| 南华县| 司法| 临江市| 兴业县| 忻州市| 江西省| 鄄城县| 宜春市| 宁德市| 克东县| 巴楚县| 盐津县| 凤冈县| 鹤峰县| 远安县| 河曲县| 独山县| 淮滨县| 金平| 郸城县| 武宁县| 衡水市| 甘孜县| 仙游县|