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怎么扩容...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 安装pdo odbc,PHP P
- 下一篇: android下挂串口中断,请大神看看为