arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...
ArrayList大家都知道了吧,這是一個(gè)動(dòng)態(tài)數(shù)組。以java語(yǔ)言來(lái)說(shuō),數(shù)組是定長(zhǎng)的,在被創(chuàng)建之后就不能被加長(zhǎng)或縮短了,因此,了解它的擴(kuò)容機(jī)制對(duì)使用它尤為重要。下面,我們就一起來(lái)看看它的擴(kuò)容機(jī)制是怎么實(shí)現(xiàn)的吧。
首先我們知道,ArrayList有著三種初始化方式:
1)指定大小初始化public?ArrayList(int?initialCapacity)
2)傳入一個(gè)Collection對(duì)象初始化,并將對(duì)象中的數(shù)據(jù)添加到ArrayList中public?ArrayList(Collection?c)
3)默認(rèn)構(gòu)造函數(shù)初始化public?ArrayList()
ArrayList擴(kuò)容機(jī)制發(fā)生在add()方法調(diào)用的時(shí)候,從下面的代碼我們可以看出當(dāng)使用無(wú)參構(gòu)造函數(shù)創(chuàng)建ArrayList時(shí),它的默認(rèn)長(zhǎng)度會(huì)為0private?static?final?Object[]?DEFAULTCAPACITY_EMPTY_ELEMENTDATA?=?{};
public?ArrayList()
{
this.elementData?=?DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
下面是add()方法的源碼:public?boolean?add(E?e)
{
//擴(kuò)容
ensureCapacityInternal(size?+?1);?//?Increments?modCount!!
elementData[size++]?=?e;
return?true;
}
根據(jù)以上我們可以看到,ensureCapacityInternal()是用來(lái)擴(kuò)容的,形參為最小擴(kuò)容量,進(jìn)入此方法后:private?void?ensureCapacityInternal(int?minCapacity)
{
ensureExplicitCapacity(calculateCapacity(elementData,?minCapacity));
}
通過(guò)方法calculateCapacity(elementData, minCapacity)來(lái)獲取:private?static?int?calculateCapacity(Object[]?elementData,?int?minCapacity)
{
//如果傳入的是個(gè)空數(shù)組則最小容量取默認(rèn)容量與minCapacity之間的最大值
if?(elementData?==?DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
{
return?Math.max(DEFAULT_CAPACITY,?minCapacity);
}
return?minCapacity;
}
ensureExplicitCapacity方法可以判斷是否需要擴(kuò)容:
private?void?ensureExplicitCapacity(int?minCapacity)
{
modCount++;
//?如果最小需要空間比elementData的內(nèi)存空間要大,則需要擴(kuò)容
if?(minCapacity?-?elementData.length?>?0)
//擴(kuò)容?grow(minCapacity);
}
下面是重點(diǎn)來(lái)了,ArrayList擴(kuò)容機(jī)制關(guān)鍵方法grow():private?void?grow(int?minCapacity)
{
//?獲取到ArrayList中elementData數(shù)組的內(nèi)存空間長(zhǎng)度
int?oldCapacity?=?elementData.length;
//?擴(kuò)容至原來(lái)的1.5倍
int?newCapacity?=?oldCapacity?+?(oldCapacity?>>?1);
//?再判斷一下新數(shù)組的容量夠不夠,夠了就直接使用這個(gè)長(zhǎng)度創(chuàng)建新數(shù)組,
//?不夠就將數(shù)組長(zhǎng)度設(shè)置為需要的長(zhǎng)度
if?(newCapacity?-?minCapacity?
newCapacity?=?minCapacity;
//若預(yù)設(shè)值大于默認(rèn)的最大值檢查是否溢出
if?(newCapacity?-?MAX_ARRAY_SIZE?>?0)
newCapacity?=?hugeCapacity(minCapacity);
//?調(diào)用Arrays.copyOf方法將elementData數(shù)組指向新的內(nèi)存空間時(shí)newCapacity的連續(xù)空間
//?并將elementData的數(shù)據(jù)復(fù)制到新的內(nèi)存空間
elementData?=?Arrays.copyOf(elementData,?newCapacity);
}
因此,我們可以清晰看出ArrayList擴(kuò)容的本質(zhì)其實(shí)就是計(jì)算出新的擴(kuò)容數(shù)組的size后實(shí)例化它,并將原有數(shù)組內(nèi)容復(fù)制到新數(shù)組中去。
以上就是關(guān)于ArrayList擴(kuò)容機(jī)制的全部?jī)?nèi)容了,如果你還想要了解更多有關(guān)ArrayList相關(guān)的java常見問(wèn)答知識(shí),就快來(lái)關(guān)注我們的網(wǎng)站吧。
推薦閱讀:
總結(jié)
以上是生活随笔為你收集整理的arraylist扩容是创建新数组吗 java_arraylist扩容机制要怎么实现?arraylist怎么扩容...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php 安装pdo odbc,PHP P
- 下一篇: mysql msdtc 不支持_IIS5