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

Java的ArrayList擴容源碼解析

 更新時間:2024年01月11日 10:02:56   作者:好奇的7號  
這篇文章主要介紹了Java的ArrayList擴容源碼解析,通過動態(tài)擴容,ArrayList能夠在添加元素時保持高效的性能,擴容操作是有一定開銷的,但由于擴容的時間復雜度為O(n),其中n是當前元素個數(shù),所以平均情況下,每次添加元素的時間復雜度仍然是O(1),需要的朋友可以參考下

ArrayList擴容源碼

1、擴容原理概括

ArrayList的擴容原理如下:

  • 初始容量:在創(chuàng)建ArrayList對象時,默認會分配一個初始容量。初始容量可以通過構(gòu)造函數(shù)進行指定,若未指定,則默認為10。例如,ArrayList<String> list = new ArrayList<>();會創(chuàng)建一個初始容量為10的ArrayList。
  • 添加元素:當向ArrayList中添加元素時,會先檢查當前元素個數(shù)是否已經(jīng)達到了數(shù)組的容量上限。如果元素個數(shù)等于或超過了容量上限,就需要進行擴容。
  • 擴容機制:擴容時,ArrayList會創(chuàng)建一個更大的新數(shù)組,并將原有的元素復制到新數(shù)組中。默認情況下,新數(shù)組的大小是原來容量的1.5倍(即增長50%)。例如,如果當前容量為10,那么擴容后的新容量為15。
  • 數(shù)組復制:在擴容時,ArrayList使用System.arraycopy()方法將原始數(shù)組中的元素復制到新的數(shù)組中。這是一個底層的高效數(shù)組復制方法,可以快速地將原有的數(shù)據(jù)移動到新數(shù)組中。
  • 更新引用:在完成數(shù)組復制后,ArrayList會更新內(nèi)部的引用,指向新的數(shù)組。這樣,原先的數(shù)組就會被垃圾回收器回收。

通過動態(tài)擴容,ArrayList能夠在添加元素時保持高效的性能。擴容操作是有一定開銷的,但由于擴容的時間復雜度為O(n),其中n是當前元素個數(shù),所以平均情況下,每次添加元素的時間復雜度仍然是O(1)。

同時,擴容的增長因子(即容量的增加比例)也可以被修改,以滿足特定需求。

2、源碼解析

例如,對于如下list進行添加元素,初始容量設置為5,添加6個元素:

ArrayList<String> list = new ArrayList<>(5);
list.add("1");
list.add("2");
list.add("3");
list.add("777");
list.add("888");
list.add("999");

對于一開始的前五個元素而言:

public boolean add(E e) {
        modCount++;
        add(e, elementData, size);//e是“1”,size是0,即目前元素數(shù)量,也可以理解為數(shù)組的索引
        return true;
}
 
//add源碼:
private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)//當元素數(shù)量等于arraylist數(shù)組長度,才grow擴容
            elementData = grow();
        elementData[s] = e;//否則直接在索引位置賦值
        size = s + 1;//并將索引右移
}

但在第6個元素“999”添加進去的時候,要進入grow方法進行擴容:

private void add(E e, Object[] elementData, int s) { //e是“999”,s為5
        if (s == elementData.length)//已經(jīng)相等
            elementData = grow();//步入grow
        elementData[s] = e;
        size = s + 1;
}
 
//grow源碼:輸入size + 1
private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;//舊的數(shù)組大小
 
//接下來,檢查當前數(shù)組是否為空,或者不是使用默認初始容量的空數(shù)組(即DEFAULTCAPACITY_EMPTY_ELEMENTDATA)。如果是空數(shù)組,則說明是第一次添加元素,使用默認初始容量。
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);//計算新數(shù)組大小
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
}
 
//ArraysSupport.newLength源碼:
public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
        // assert oldLength >= 0
        // assert minGrowth > 0
//minGrowth就是6 - 5 = 1,即,至少需要增大的容量
//prefGrowth為數(shù)組的舊容量的1/2
//求其max,一般為1/2。加上oldlength,所以為1.5倍
        int newLength = Math.max(minGrowth, prefGrowth) + oldLength;
        if (newLength - MAX_ARRAY_LENGTH <= 0) {
            return newLength;
        }
        return hugeLength(oldLength, minGrowth);
    }
 
//最后調(diào)用Arrays.copyOf,內(nèi)部使用System.arraycopy()方法將原始數(shù)組中的元素復制到新的數(shù)組中

實現(xiàn)擴容后,添加元素步驟同上,結(jié)束,return true

到此這篇關于Java的ArrayList擴容源碼解析的文章就介紹到這了,更多相關ArrayList擴容源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot使用OkHttp完成高效網(wǎng)絡請求詳解

    SpringBoot使用OkHttp完成高效網(wǎng)絡請求詳解

    OkHttp 是一個高效的 HTTP 客戶端,支持同步和異步請求,且具備自動處理 cookie、緩存和連接池等高級功能,下面我們來看看SpringBoot如何利用 OkHttp 完成高效網(wǎng)絡請求吧
    2025-03-03
  • Java中Object類常用的12個方法(小結(jié))

    Java中Object類常用的12個方法(小結(jié))

    Java 中的 Object 方法在面試中是一個非常高頻的點,本文主要介紹了Java中Object類常用的12個方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringBoot+WebSocket實現(xiàn)消息推送功能

    SpringBoot+WebSocket實現(xiàn)消息推送功能

    WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡協(xié)議。本文將通過SpringBoot集成WebSocket實現(xiàn)消息推送功能,感興趣的可以了解一下
    2022-08-08
  • Java使用zip4j加密壓縮和解壓文件與文件夾方式

    Java使用zip4j加密壓縮和解壓文件與文件夾方式

    文章介紹了如何使用Java的zip4j庫對文件夾進行加密壓縮,并提供了Java項目的引入和使用步驟,包括引入maven依賴、封裝工具類以及測試結(jié)果
    2025-12-12
  • Java 序列化詳解及簡單實現(xiàn)實例

    Java 序列化詳解及簡單實現(xiàn)實例

    這篇文章主要介紹了 Java 序列化詳解及簡單實現(xiàn)實例的相關資料,使用序列化目的:以某種存儲形式使自定義對象持久化,將對象從一個地方傳遞到另一個地方,需要的朋友可以參考下
    2017-03-03
  • Java中Exception和Error的區(qū)別詳解

    Java中Exception和Error的區(qū)別詳解

    這篇文章主要介紹了Java中Exception和Error的區(qū)別詳解,通過類的關系分析兩者的區(qū)別與應用場景,包含代碼實例,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 快速搭建SSM框架(Maven)五步曲的方法步驟

    快速搭建SSM框架(Maven)五步曲的方法步驟

    這篇文章主要介紹了快速搭建SSM框架(Maven)五步曲的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Java實用小技能之快速創(chuàng)建List常用幾種方式

    Java實用小技能之快速創(chuàng)建List常用幾種方式

    java集合可以說無論是面試、刷題還是工作中都是非常常用的,下面這篇文章主要給大家介紹了關于Java實用小技能之快速創(chuàng)建List常用的幾種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • JDK的Parser來解析Java源代碼詳解

    JDK的Parser來解析Java源代碼詳解

    這篇文章主要介紹了JDK的Parser來解析Java源代碼的相關資料,需要的朋友可以參考下
    2016-09-09
  • SpringBoot讀寫操作yml配置文件方法

    SpringBoot讀寫操作yml配置文件方法

    之前一直用的application.properties配置文件,只能是KV結(jié)構(gòu),后來的yml配置文件更像是樹狀結(jié)構(gòu),支持層級,比properties更靈活
    2023-01-01

最新評論

阜阳市| 临江市| 桃江县| 和龙市| 大竹县| 金塔县| 宜兰县| 闵行区| 临沂市| 海城市| 华蓥市| 壶关县| 凤阳县| 杂多县| 桐城市| 会同县| 丰顺县| 伊宁市| 响水县| 如东县| 霞浦县| 上犹县| 右玉县| 渝北区| 武陟县| 商河县| 屏山县| 佛冈县| 扬中市| 临高县| 布尔津县| 桂林市| 象山县| 越西县| 丹凤县| 体育| 界首市| 平果县| 临颍县| 萝北县| 阿拉尔市|