中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Java中怎么擴(kuò)容ArrayList

Java中怎么擴(kuò)容ArrayList,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

成都創(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ǔ)超過(guò)ArrayList存儲(chǔ)新元素前的存儲(chǔ)能力,ArrayList會(huì)增強(qiáng)自身的存儲(chǔ)能力,已達(dá)到存儲(chǔ)新元素的要求

ArrayList:本質(zhì)通過(guò)內(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方法首先通過(guò)ensureCapacityInternal()方法確保當(dāng)前ArrayList維護(hù)的數(shù)組具有存儲(chǔ)新元素的能力,經(jīng)過(guò)處理之后將元素存儲(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ǔ)能力為原來(lái)的1.5倍

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

如果擴(kuò)容之后還是不能滿足要求則MAX_ARRAY_SIZE比較,求取最大值,

如果MAX_ARRAY_SIZE大小的能力還是不能滿足則通過(guò)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的本地庫(kù),不可避免的會(huì)進(jìn)行IO操作,如果頻繁的對(duì)ArrayList進(jìn)行擴(kuò)容,毫不疑問(wèn)會(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)頁(yè)鏈接:http://m.2m8n56k.cn/article36/pccgpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)電子商務(wù)響應(yīng)式網(wǎng)站手機(jī)網(wǎng)站建設(shè)網(wǎng)頁(yè)設(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;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
主站蜘蛛池模板: 中文字幕在线免费观看 | 伊人色综合久久成人 | 欧美日韩一区二区高清视 | 精品日韩二区三区精品视频 | 成年人看的毛片 | 亚洲成人在线视频 | 欧美黄色免费 | 欧美日韩国产成人精品 | 国产精品久久久久久久久 | 美女免费毛片 | 成年人福利视频 | 欧美色爱综合 | 成人免费看www网址入口 | 香蕉久久夜色精品国产尤物 | 337p粉嫩大胆噜噜噜鲁 | 国产 日韩 欧美 在线 | 久久久久久一级毛片免费无遮挡 | 中文字幕视频在线 | 午夜爱爱毛片xxxx视频免费看 | 成人看片黄a在线看 | 欧美综合图片一区二区三区 | 北条麻妃在线一区二区 | 欧美三级做爰在线 | 欧美一区不卡二区不卡三区 | 欧美成人一区二区三区在线视频 | 99视频精品全国免费 | 在线精品欧美日韩 | 3至13呦女毛片 | 中文字幕精品一区二区三区视频 | 色老头久久久久 | 97久久精品午夜一区二区 | 久久亚洲国产伦理 | aaaaaa精品视频在线观看 | 欧美成人三级大全 | 欧美成人性色xxxxx视频大 | 99国内精品| 久久欧美精品 | 成年女人毛片免费视频 | 日本又黄又爽又免费 | 精品无码三级在线观看视频 | 国产亚洲欧美在线播放网站 |