麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

對Java ArrayList的自動擴容機制示例講解

2024-07-14 08:42:32
字體:
供稿:網(wǎng)友

注意:

不同的JDK版本的擴容機制可能有差異

實驗環(huán)境:JDK1.8

擴容機制:

當(dāng)向ArrayList中添加元素的時候,ArrayList如果要滿足新元素的存儲超過ArrayList存儲新元素前的存儲能力,ArrayList會增強自身的存儲能力,已達到存儲新元素的要求

ArrayList:本質(zhì)通過內(nèi)部維護的數(shù)組對象進行數(shù)據(jù)存儲

①:分析ArrayList的add(E)方法

 public boolean add(E e) {  ensureCapacityInternal(size + 1); // Increments modCount!!  elementData[size++] = e;  return true; }

分析:add方法首先通過ensureCapacityInternal()方法確保當(dāng)前ArrayList維護的數(shù)組具有存儲新元素的能力,經(jīng)過處理之后將元素存儲在數(shù)組elementData的尾部

elementData:ArrayList真正用于存儲元素的數(shù)組

②:分析ensureCapacityInternal方法

private void ensureCapacityInternal(int minCapacity) {  if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {   minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);  }  ensureExplicitCapacity(minCapacity); }

分析:ensureCapacityInternal判斷ArrayList默認(rèn)的元素存儲數(shù)據(jù)是否為空,為空則設(shè)置最小要求的存儲能力為必要存儲的元素和默認(rèn)存儲元素個數(shù)的兩個數(shù)據(jù)之間的最大值,然后調(diào)用ensureExplicitCapacity方法實現(xiàn)這種最低要求的存儲能力

注意:ArrayList的存儲空間并不是需要一個創(chuàng)建一個,而是分階段性的創(chuàng)建,一般會預(yù)留存儲空間。

例如,如果ArrayList需要存儲10個元素,恰好ArrayList只能存儲6個元素,剩余4個元素?zé)o法存儲,ArrayList可能會一次性擴展10個元素,這種ArrayList就有20個元素的存儲能力,在存儲能力范圍內(nèi),下次再存放元素,就不需要再次擴容

③:分析ensureExplicitCapacity方法:

 private void ensureExplicitCapacity(int minCapacity) {  modCount++;  // overflow-conscious code  if (minCapacity - elementData.length > 0)   grow(minCapacity); }

分析:如果最低要求的存儲能力>ArrayList已有的存儲能力,這就表示ArrayList的存儲能力不足,因此需要調(diào)用 grow();方法進行擴容

④:分析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擴容的時候,首先會設(shè)置新的存儲能力為原來的1.5倍

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

如果擴容之后還是不能滿足要求則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最大的存儲能力:存儲元素的個數(shù)為整型的范圍。

確定ArrayList擴容之后最新的可存儲元素個數(shù)時,調(diào)用

elementData = Arrays.copyOf(elementData, newCapacity); 

實現(xiàn)elementData數(shù)組的擴容,整個流程就是ArrayList的自動擴容機制工作流程

擴展:

ArrayList的自動擴容機制底層借助于System實現(xiàn)

 public static native void arraycopy (Object src, int srcPos, Object dest, int destPos, int length);

arraycopy標(biāo)識為native意味JDK的本地庫,不可避免的會進行IO操作,如果頻繁的對ArrayList進行擴容,毫不疑問會降低ArrayList的使用性能,因此當(dāng)我們確定添加元素的個數(shù)的時候,我們可以事先知道并指定ArrayList的可存儲元素的個數(shù),這樣當(dāng)我們向ArrayList中加入元素的時候,就可以避免ArrayList的自動擴容,從而提高ArrayList的性能

ArrayList含參構(gòu)造函數(shù):初始化時指定存儲元素的能力:

 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);              } }

以上這篇對Java ArrayList的自動擴容機制示例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 91精品欧美一区二区三区 | 福利在线播放 | 中文字幕在线观看成人 | 久久久久久久久浪潮精品 | 麻豆国产网站 | 日本欧美一区二区三区在线观看 | 成人男女啪啪免费观看网站四虎 | 免费视频a | 91福利免费视频 | 亚洲成人在线视频网站 | 在线视频 欧美日韩 | 91精品国产综合久久婷婷香 | 男女羞羞视频 | 海角在线观看91一区二区 | 福利四区| 欧美日韩精品中文字幕 | 在线播放一级片 | 日本在线观看视频网站 | 欧美成年性h版影视中文字幕 | 精品国产精品久久 | 黄色特级视频 | 深夜福利视频免费观看 | 成年人视频免费 | 暖暖免费观看高清完整版电影 | 91成人免费看 | 最新91在线视频 | 久久国产免费 | 美女被免费网站在线软件 | 亚洲一区二区不卡视频 | 黄网站免费入口 | 国产精品久久久久久久不卡 | 主播粉嫩国产在线精品 | 77成人影院 | 成人一级黄色片 | 国产午夜精品理论片a级探花 | 激情福利视频 | 国产精品成aⅴ人片在线观看 | 操操操日日日干干干 | 欧美黑人伦理 | 亚洲极色 | 中文字幕一区久久 |