Java中怎么擴(kuò)容ArrayList,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
成都創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元寶坻做網(wǎng)站,已為上家服務(wù),為寶坻各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
注意:
不同的JDK版本的擴(kuò)容機(jī)制可能有差異
實(shí)驗(yàn)環(huán)境:JDK1.8
擴(kuò)容機(jī)制:
當(dāng)向ArrayList中添加元素的時(shí)候,ArrayList如果要滿足新元素的存儲(chǔ)超過ArrayList存儲(chǔ)新元素前的存儲(chǔ)能力,ArrayList會(huì)增強(qiáng)自身的存儲(chǔ)能力,已達(dá)到存儲(chǔ)新元素的要求
ArrayList:本質(zhì)通過內(nèi)部維護(hù)的數(shù)組對(duì)象進(jìn)行數(shù)據(jù)存儲(chǔ)
①:分析ArrayList的add(E)方法
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
分析:add方法首先通過ensureCapacityInternal()方法確保當(dāng)前ArrayList維護(hù)的數(shù)組具有存儲(chǔ)新元素的能力,經(jīng)過處理之后將元素存儲(chǔ)在數(shù)組elementData的尾部
elementData:ArrayList真正用于存儲(chǔ)元素的數(shù)組
②:分析ensureCapacityInternal方法
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
分析:ensureCapacityInternal判斷ArrayList默認(rèn)的元素存儲(chǔ)數(shù)據(jù)是否為空,為空則設(shè)置最小要求的存儲(chǔ)能力為必要存儲(chǔ)的元素和默認(rèn)存儲(chǔ)元素個(gè)數(shù)的兩個(gè)數(shù)據(jù)之間的最大值,然后調(diào)用ensureExplicitCapacity方法實(shí)現(xiàn)這種最低要求的存儲(chǔ)能力
注意:ArrayList的存儲(chǔ)空間并不是需要一個(gè)創(chuàng)建一個(gè),而是分階段性的創(chuàng)建,一般會(huì)預(yù)留存儲(chǔ)空間。
例如,如果ArrayList需要存儲(chǔ)10個(gè)元素,恰好ArrayList只能存儲(chǔ)6個(gè)元素,剩余4個(gè)元素?zé)o法存儲(chǔ),ArrayList可能會(huì)一次性擴(kuò)展10個(gè)元素,這種ArrayList就有20個(gè)元素的存儲(chǔ)能力,在存儲(chǔ)能力范圍內(nèi),下次再存放元素,就不需要再次擴(kuò)容
③:分析ensureExplicitCapacity方法:
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
分析:如果最低要求的存儲(chǔ)能力>ArrayList已有的存儲(chǔ)能力,這就表示ArrayList的存儲(chǔ)能力不足,因此需要調(diào)用 grow();方法進(jìn)行擴(kuò)容
④:分析grow()方法
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
分析:當(dāng)ArrayList擴(kuò)容的時(shí)候,首先會(huì)設(shè)置新的存儲(chǔ)能力為原來的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
如果擴(kuò)容之后還是不能滿足要求則MAX_ARRAY_SIZE比較,求取最大值,
如果MAX_ARRAY_SIZE大小的能力還是不能滿足則通過hugeCapacity()方法獲取ArrayList能允許的最大值:
private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
從hugeCapacity方法看出,ArrayList最大的存儲(chǔ)能力:存儲(chǔ)元素的個(gè)數(shù)為整型的范圍。
確定ArrayList擴(kuò)容之后最新的可存儲(chǔ)元素個(gè)數(shù)時(shí),調(diào)用
elementData = Arrays.copyOf(elementData, newCapacity);
實(shí)現(xiàn)elementData數(shù)組的擴(kuò)容,整個(gè)流程就是ArrayList的自動(dòng)擴(kuò)容機(jī)制工作流程
擴(kuò)展:
ArrayList的自動(dòng)擴(kuò)容機(jī)制底層借助于System實(shí)現(xiàn)
public static native void arraycopy (Object src, int srcPos, Object dest, int destPos, int length);
arraycopy標(biāo)識(shí)為native意味JDK的本地庫,不可避免的會(huì)進(jìn)行IO操作,如果頻繁的對(duì)ArrayList進(jìn)行擴(kuò)容,毫不疑問會(huì)降低ArrayList的使用性能,因此當(dāng)我們確定添加元素的個(gè)數(shù)的時(shí)候,我們可以事先知道并指定ArrayList的可存儲(chǔ)元素的個(gè)數(shù),這樣當(dāng)我們向ArrayList中加入元素的時(shí)候,就可以避免ArrayList的自動(dòng)擴(kuò)容,從而提高ArrayList的性能
ArrayList含參構(gòu)造函數(shù):初始化時(shí)指定存儲(chǔ)元素的能力:
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); } }
看完上述內(nèi)容,你們掌握J(rèn)ava中怎么擴(kuò)容ArrayList的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
標(biāo)題名稱:Java中怎么擴(kuò)容ArrayList
網(wǎng)頁鏈接:http://aaarwkj.com/article36/pccgpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、、電子商務(wù)、響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)