日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...

發布時間:2024/9/27 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ArrayList大家都知道了吧,這是一個動態數組。以java語言來說,數組是定長的,在被創建之后就不能被加長或縮短了,因此,了解它的擴容機制對使用它尤為重要。下面,我們就一起來看看它的擴容機制是怎么實現的吧。

首先我們知道,ArrayList有著三種初始化方式:

1)指定大小初始化public?ArrayList(int?initialCapacity)

2)傳入一個Collection對象初始化,并將對象中的數據添加到ArrayList中public?ArrayList(Collection?c)

3)默認構造函數初始化public?ArrayList()

ArrayList擴容機制發生在add()方法調用的時候,從下面的代碼我們可以看出當使用無參構造函數創建ArrayList時,它的默認長度會為0private?static?final?Object[]?DEFAULTCAPACITY_EMPTY_ELEMENTDATA?=?{};

public?ArrayList()

{

this.elementData?=?DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

下面是add()方法的源碼:public?boolean?add(E?e)

{

//擴容

ensureCapacityInternal(size?+?1);?//?Increments?modCount!!

elementData[size++]?=?e;

return?true;

}

根據以上我們可以看到,ensureCapacityInternal()是用來擴容的,形參為最小擴容量,進入此方法后:private?void?ensureCapacityInternal(int?minCapacity)

{

ensureExplicitCapacity(calculateCapacity(elementData,?minCapacity));

}

通過方法calculateCapacity(elementData, minCapacity)來獲取:private?static?int?calculateCapacity(Object[]?elementData,?int?minCapacity)

{

//如果傳入的是個空數組則最小容量取默認容量與minCapacity之間的最大值

if?(elementData?==?DEFAULTCAPACITY_EMPTY_ELEMENTDATA)

{

return?Math.max(DEFAULT_CAPACITY,?minCapacity);

}

return?minCapacity;

}

ensureExplicitCapacity方法可以判斷是否需要擴容:

private?void?ensureExplicitCapacity(int?minCapacity)

{

modCount++;

//?如果最小需要空間比elementData的內存空間要大,則需要擴容

if?(minCapacity?-?elementData.length?>?0)

//擴容?grow(minCapacity);

}

下面是重點來了,ArrayList擴容機制關鍵方法grow():private?void?grow(int?minCapacity)

{

//?獲取到ArrayList中elementData數組的內存空間長度

int?oldCapacity?=?elementData.length;

//?擴容至原來的1.5倍

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

//?再判斷一下新數組的容量夠不夠,夠了就直接使用這個長度創建新數組,

//?不夠就將數組長度設置為需要的長度

if?(newCapacity?-?minCapacity?

newCapacity?=?minCapacity;

//若預設值大于默認的最大值檢查是否溢出

if?(newCapacity?-?MAX_ARRAY_SIZE?>?0)

newCapacity?=?hugeCapacity(minCapacity);

//?調用Arrays.copyOf方法將elementData數組指向新的內存空間時newCapacity的連續空間

//?并將elementData的數據復制到新的內存空間

elementData?=?Arrays.copyOf(elementData,?newCapacity);

}

因此,我們可以清晰看出ArrayList擴容的本質其實就是計算出新的擴容數組的size后實例化它,并將原有數組內容復制到新數組中去。

以上就是關于ArrayList擴容機制的全部內容了,如果你還想要了解更多有關ArrayList相關的java常見問答知識,就快來關注我們的網站吧。

推薦閱讀:

總結

以上是生活随笔為你收集整理的arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。