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

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è)
亚洲精品熟女国产中文| 亚洲成人免费在线播放| 亚洲综合日韩丝袜人妻| 久久99精品国产99久久无| 免费不卡无码毛片观看| 首页亚洲一区二区三区| 亚洲熟女少妇淫语高潮| 蜜臀一二区免费在线视频| 99热在线免费观看精品| 日韩黄色成人免费片子| 日本道视频一区二区三区| 婷婷五五月深爱开心激情| 九九六热这里只有精品| 亚洲精品入口一区二区| 亚洲三级伦理中文字幕| 成人国产在线欧美精品| 国产精品夫妇在线激情啪| 免费观看毛片一区二区三区| 日韩av在线专区观看| 首页亚洲一区二区三区| 七十二式性日韩视频| 视频一区日本视频二区| 色悠悠粉嫩一区二区三区| 国产精品一区二区久久蜜桃麻豆| 欧美日韩激情中文字幕| 亚洲欧美精品专区久久| 精品亚洲一区二区三区四| 亚洲一区二区三区av蜜桃| 亚洲中文字幕一区二区人妻| 日本成人精品一区二区三区| 日本成人高清一区二区| 七十二式性日韩视频| 亚洲乱码精品一区二区| 欧美日韩国产一区在线观看| 欧美精品成人免费在线| 黄色录像三级黄色录像三级黄色| 日本 午夜 在线 视频| 国产精品色网在线播放| 中文字幕人妻秘书社长| 亚洲av综合日韩精品久久| 国产91九色在线播放|