最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

對(duì)Java ArrayList的自動(dòng)擴(kuò)容機(jī)制示例講解

 更新時(shí)間:2018年10月13日 09:06:31   作者:ZERONELOVE  
今天小編就為大家分享一篇對(duì)Java ArrayList的自動(dòng)擴(kuò)容機(jī)制示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

注意:

不同的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);            
  }
 }

以上這篇對(duì)Java ArrayList的自動(dòng)擴(kuò)容機(jī)制示例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 14 發(fā)布了,你還會(huì)使用Lombok?

    Java 14 發(fā)布了,你還會(huì)使用Lombok?

    2020年3月17日發(fā)布,Java正式發(fā)布了JDK 14 ,目前已經(jīng)可以開(kāi)放下載。在JDK 14中,共有16個(gè)新特性,本文主要來(lái)介紹其中的一個(gè)特性:JEP 359: Records,需要的朋友可以參考下
    2020-04-04
  • Spring?Validation參數(shù)效驗(yàn)的各種使用姿勢(shì)總結(jié)

    Spring?Validation參數(shù)效驗(yàn)的各種使用姿勢(shì)總結(jié)

    在實(shí)際項(xiàng)目中經(jīng)常需要對(duì)前段傳來(lái)的數(shù)據(jù)進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于Spring?Validation參數(shù)效驗(yàn)的各種使用姿勢(shì),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • JAVA中通過(guò)Hibernate-Validation進(jìn)行參數(shù)驗(yàn)證

    JAVA中通過(guò)Hibernate-Validation進(jìn)行參數(shù)驗(yàn)證

    這篇文章主要介紹了JAVA中通過(guò)Hibernate-Validation進(jìn)行參數(shù)驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JBoss5.x下配置Log4j方法介紹

    JBoss5.x下配置Log4j方法介紹

    這篇文章主要介紹了JBoss5.x下配置Log4j方法介紹,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • javaweb圖書商城設(shè)計(jì)之圖書模塊(4)

    javaweb圖書商城設(shè)計(jì)之圖書模塊(4)

    這篇文章主要介紹了javaweb圖書商城設(shè)計(jì)之圖書模塊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法

    最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法

    這篇文章主要介紹了最簡(jiǎn)單的MyBatis Plus的多表聯(lián)接、分頁(yè)查詢實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot之跨域過(guò)濾器配置允許跨域訪問(wèn)方式

    SpringBoot之跨域過(guò)濾器配置允許跨域訪問(wèn)方式

    這篇文章主要介紹了SpringBoot之跨域過(guò)濾器配置允許跨域訪問(wèn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java線程的生命周期命名與獲取代碼實(shí)現(xiàn)

    Java線程的生命周期命名與獲取代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java線程的生命周期命名與獲取代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 修改request的parameter的幾種方式總結(jié)

    修改request的parameter的幾種方式總結(jié)

    這篇文章主要介紹了修改request的parameter的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot整合spring-retry的實(shí)現(xiàn)示例

    springboot整合spring-retry的實(shí)現(xiàn)示例

    本文將結(jié)合實(shí)例代碼,介紹springboot整合spring-retry的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

都江堰市| 碌曲县| 高安市| 南漳县| 兴文县| 镇坪县| 哈巴河县| 新绛县| 新宾| 大姚县| 白玉县| 百色市| 南平市| 阿尔山市| 房产| 布拖县| 大石桥市| 阿瓦提县| 千阳县| 临沧市| 宁波市| 紫阳县| 社旗县| 汉阴县| 桦南县| 华阴市| 东兴市| 遵化市| 滕州市| 九寨沟县| 深泽县| 凤台县| 大冶市| 天水市| 南康市| 天全县| 叶城县| 晋州市| 依安县| 崇左市| 隆昌县|