1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java中怎么擴容ArrayList-創(chuàng)新互聯(lián)

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

      創(chuàng)新互聯(lián)服務(wù)項目包括武江網(wǎng)站建設(shè)、武江網(wǎng)站制作、武江網(wǎng)頁制作以及武江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,武江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到武江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

      注意:

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

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

      擴容機制:

      當向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()方法確保當前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默認的元素存儲數(shù)據(jù)是否為空,為空則設(shè)置最小要求的存儲能力為必要存儲的元素和默認存儲元素個數(shù)的兩個數(shù)據(jù)之間的大值,然后調(diào)用ensureExplicitCapacity方法實現(xiàn)這種最低要求的存儲能力

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

      例如,如果ArrayList需要存儲10個元素,恰好ArrayList只能存儲6個元素,剩余4個元素無法存儲,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);
       }

      分析:當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標識為native意味JDK的本地庫,不可避免的會進行IO操作,如果頻繁的對ArrayList進行擴容,毫不疑問會降低ArrayList的使用性能,因此當我們確定添加元素的個數(shù)的時候,我們可以事先知道并指定ArrayList的可存儲元素的個數(shù),這樣當我們向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);            
        }
       }

      看完上述內(nèi)容,你們掌握Java中怎么擴容ArrayList的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


      網(wǎng)頁標題:Java中怎么擴容ArrayList-創(chuàng)新互聯(lián)
      鏈接地址:http://www.ef60e0e.cn/article/dcshhh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        桃园县| 三门县| 壤塘县| 化德县| 英山县| 册亨县| 云阳县| 苏尼特左旗| 北宁市| 大姚县| 扬中市| 民丰县| 山阳县| 平塘县| 纳雍县| 开封市| 鸡泽县| 托克逊县| 竹山县| 沙田区| 新竹市| 遂宁市| 塘沽区| 乌鲁木齐市| 嘉黎县| 德格县| 平南县| 定西市| 攀枝花市| 屏南县| 思南县| 崇义县| 常宁市| 改则县| 浑源县| 镇安县| 镇平县| 鄄城县| 万宁市| 江都市| 城口县|