欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中怎么擴(kuò)容ArrayList

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)

成都定制網(wǎng)站建設(shè)
在线免费观看日本91| 熟妞人妻精品一区二区视频 | 欧洲精品亚洲精品日韩专区| 日韩中文字幕在线二区| 久久精品国产精油按摩| 秋霞日韩欧美一区二区三区| 日本久久在线观看视频| 国产黄色一区二区三区,| 国产成人av网站在线观看| 国产精品国产精品国产| 亚洲乱码中文字幕在线观看| 日本国产美女精品一区二区| 久久最新最热视频精品| 亚洲最色最黄大片在线视频| 极品少妇高潮在线观看免费| 久久久偷拍美女撒尿尿| 日本精品1区国产精品| 夜夜草av一区二区三区| 日本大胆高清人体艺术| 五月婷婷丁香综合中文字幕| 日韩免费精品一区二区| 国产模特一区二区三区| 亚洲午夜福利理论片在线| 99国产综合精品女| 男女视频午夜刺激一区二区| 欧美口爆吞精在线播放| 91九色在线精品一区| 亚洲国产成人精品久久精品| 国产av一区二区三区日韩接吻| 亚洲一区二区另类视频| 日本午夜激情一区二区| 欧美艳星一区二区三区四区| 欧美成人高清在线播放| 欧美日韩中文国产天堂| 国产老熟女高潮视频| 日韩最新视频一区二区三| 久久久亚洲福利精品午夜| 久久欧精品欧美日韩精品| 欧美精品一区二区三区在线| 在线免费观看成人午夜福利| 欧美黄色一区二区三区精品|