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

Java中的ArrayList(擴(kuò)容機(jī)制)詳解

 更新時(shí)間:2024年11月04日 09:13:13   作者:小喬努力變強(qiáng)  
ArrayList作為Java中廣泛使用的動(dòng)態(tài)數(shù)組,其擴(kuò)容機(jī)制是保證性能和內(nèi)存使用平衡的關(guān)鍵,默認(rèn)初始容量為10,擴(kuò)容因子為1.5,旨在減少頻繁的內(nèi)存分配和數(shù)據(jù)遷移代價(jià),同時(shí)建議使用預(yù)估計(jì)的初始化容量以減少擴(kuò)容次數(shù)

背景介紹

對(duì)于ArrayList集合可能大家并不陌生,但ArrayList集合的擴(kuò)容機(jī)制大家是否了解呢?我們今天著重來看看

適用于什么場(chǎng)景?

檢索比較多的場(chǎng)景

ArrayList特點(diǎn)

  • 1、ArrayList集合底層采用了數(shù)據(jù)這種數(shù)據(jù)結(jié)構(gòu),是Object類型
  • 2、ArrayList的默認(rèn)初始容量為10,擴(kuò)容因子為1.5
  • 3、建議給定一個(gè)預(yù)估計(jì)的初始化容量,減少數(shù)組擴(kuò)容的次數(shù),這是ArrayList集合比較重要的優(yōu)化策略.因?yàn)樵谠跀U(kuò)容的同時(shí)需要將原來數(shù)組中的數(shù)據(jù)復(fù)制到新數(shù)組里,但如果要插入大量數(shù)據(jù)時(shí),賦值數(shù)組的形式效率很低,所以大多數(shù)情況下會(huì)使用帶參構(gòu)造函數(shù),傳入一個(gè)預(yù)估計(jì)容量,提前定義好容量。
  • 4、ArrayList是非線程安全的

實(shí)戰(zhàn)演練

import java.util.ArrayList;
import java.util.List;

public class ListTest {
public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("b");//第一個(gè),索引下標(biāo)0
    list.add("d");
    list.add("c");
    list.add("a");
    list.add("d"); //允許使用重復(fù)元素

    System.out.println(list);  //輸出結(jié)果:[b, d, c, a, d]
    System.out.println(list.get(2));  //輸出指定下標(biāo)的元素,輸出結(jié)果:c

    list.add(1,"f");//在指定索引下標(biāo)位置添加元素
    System.out.println(list); //輸出結(jié)果:[b, f, d, c, a, d],原來下標(biāo)為1和1之后的下標(biāo)索引位置的元素自動(dòng)向后移動(dòng)

    List<String> a = new ArrayList<String>();
    a.add("123");
    a.add("456");
    list.addAll(2,a);  //在指定索引下標(biāo)的位置插入集合
    System.out.println(list);//輸出結(jié)果:[b, f, 123, 456, d, c, a, d]

    //獲取指定元素在集合中第一次出現(xiàn)的索引下標(biāo)
    System.out.println(list.indexOf("d")); //輸出結(jié)果:4
    //獲取指定元素在集合中最后一次出現(xiàn)的索引下標(biāo)
    System.out.println(list.lastIndexOf("d"));//輸出結(jié)果:7

    list.remove(2);  //根據(jù)指定的索引下標(biāo)移除元素
    System.out.println(list);  //輸出結(jié)果:[b, f, 456, d, c, a, d]

    list.set(1,"ff"); //根據(jù)指定的索引下標(biāo)修改元素
    System.out.println(list); //輸出結(jié)果:[b, ff, 456, d, c, a, d]

    //根據(jù)索引下標(biāo)的起始位置截取一段元素形成一個(gè)新的集合,截取的時(shí)候,包含開始的索引不包含結(jié)束時(shí)的索引
    List<String> sublist= list.subList(2,4);
    System.out.println(sublist);//輸出結(jié)果:[456, d]

    System.out.println(list.size());//輸出結(jié)果7
    }
}
import java.util.LinkedList;
import java.util.List;

public class ListTest {
public static void main(String[] args){
    List l1 = new LinkedList();
    for(int i = 0;i<=5;i++){
    l1.add("a"+i);
    }

    System.out.print(l1);
    l1.add(3,"a100");
    System.out.println(l1);
    l1.set(6,"a200");
    System.out.println(l1);
    System.out.print((String)l1.get(2)+" ");
    System.out.println(l1.indexOf("a3"));
    l1.remove(1);
    System.out.println(l1);
    }
}

輸出結(jié)果:

[a0,a1,a2,a3,a4,a5]

[a0,a1,a2,a100,a3,a4,a5]

[a0,a1,a2,a100,a3,a4,a200]

a2 4

[a0,a2,a100,a3,a4,a200]

ArrayList擴(kuò)容機(jī)制

ArrayList的使用前不需要像數(shù)組一樣提前定義大小空間,容量是隨著使用時(shí)自動(dòng)增長的,那為什么在使用ArrayList的add方法添加元素的時(shí)候底層還需要判斷集合的容量是否能夠放下要添加的元素呢?

又沒有定義固定大小直接放進(jìn)去不就好了嗎?

add方法添加分為三步:

  • ①、判斷集合容量是否滿足添加的元素
  • ②、添加元素
  • ③、集合長度+1

解答:

用戶不需要提前定義大小,那是因?yàn)榈讓幽J(rèn)已經(jīng)定義好了大小。

其實(shí)是有一個(gè)邊界值的,并不是無限增長的。

使用時(shí)增加,是因?yàn)榈讓佑袛U(kuò)展因子(擴(kuò)容因子是1.5),當(dāng)數(shù)量達(dá)到數(shù)組的百分之多少的時(shí)候就會(huì)擴(kuò)容。ArrayList默認(rèn)的初始大小是10

問題:大家可以思考思考為什么ArrayList底層擴(kuò)容因子是1.5?為什么不是1.3、2.4……

ArrayList的底層擴(kuò)容因子是1.5,而不是其他數(shù)字,是為了在平衡內(nèi)存使用和性能之間找到一個(gè)合適的折中方案。

下面是一些原因:

  1. 內(nèi)存分配的效率:擴(kuò)容因子的選擇會(huì)影響內(nèi)存分配的效率。如果擴(kuò)容因子過小,每次擴(kuò)容都只增加少量的容量,這會(huì)導(dǎo)致頻繁的內(nèi)存分配操作,增加了時(shí)間和空間的開銷。而如果擴(kuò)容因子過大,每次擴(kuò)容都會(huì)增加大量的容量,這可能會(huì)導(dǎo)致浪費(fèi)過多的內(nèi)存。1.5是一個(gè)相對(duì)較小的擴(kuò)容因子,可以在一定程度上平衡內(nèi)存使用和性能。
  2. 數(shù)據(jù)遷移的代價(jià):當(dāng)ArrayList需要擴(kuò)容時(shí),需要將原有數(shù)據(jù)遷移到新的更大的數(shù)組中。擴(kuò)容因子的選擇會(huì)影響數(shù)據(jù)遷移的頻率和代價(jià)。較小的擴(kuò)容因子會(huì)導(dǎo)致更頻繁的數(shù)據(jù)遷移,而較大的擴(kuò)容因子會(huì)減少數(shù)據(jù)遷移的次數(shù)。1.5作為一個(gè)相對(duì)較小的擴(kuò)容因子,可以在一定程度上減少數(shù)據(jù)遷移的代價(jià)。
  3. 性能和空間的平衡:ArrayList旨在提供高效的隨機(jī)訪問和動(dòng)態(tài)增長的能力。選擇1.5作為擴(kuò)容因子可以在一定程度上平衡性能和空間的需求。較小的擴(kuò)容因子可以減少內(nèi)存的浪費(fèi),而較大的擴(kuò)容因子可以減少內(nèi)存分配的頻率。

綜上所述,ArrayList的特點(diǎn)如下

  • 1、ArrayList集合底層采用了數(shù)據(jù)這種數(shù)據(jù)結(jié)構(gòu),是Object類型
  • 2、ArrayList的默認(rèn)初始容量為10,擴(kuò)容因子為1.5
  • 3、建議給定一個(gè)預(yù)估計(jì)的初始化容量,減少數(shù)組擴(kuò)容的次數(shù),這是ArrayList集合比較重要的優(yōu)化策略.因?yàn)樵谠跀U(kuò)容的同時(shí)需要將原來數(shù)組中的數(shù)據(jù)復(fù)制到新數(shù)組里,但如果要插入大量數(shù)據(jù)時(shí),賦值數(shù)組的形式效率很低,所以大多數(shù)情況下會(huì)使用帶參構(gòu)造函數(shù),傳入一個(gè)預(yù)估計(jì)容量,提前定義好容量。
  • 4、ArrayList是非線程安全的

總結(jié)

需要注意的是,擴(kuò)容因子的選擇并不是一個(gè)固定的標(biāo)準(zhǔn),可以根據(jù)具體的應(yīng)用場(chǎng)景和性能需求進(jìn)行調(diào)整。

在實(shí)際使用中,可以根據(jù)經(jīng)驗(yàn)和性能測(cè)試來選擇合適的擴(kuò)容因子,以滿足應(yīng)用的需求。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot集成PostgreSQL表級(jí)備份與恢復(fù)的實(shí)戰(zhàn)指南

    SpringBoot集成PostgreSQL表級(jí)備份與恢復(fù)的實(shí)戰(zhàn)指南

    本文介紹了在企業(yè)級(jí)應(yīng)用中使用SpringBoot+PostgreSQL實(shí)現(xiàn)數(shù)據(jù)備份與恢復(fù)的方法,主要包括使用pg_dump導(dǎo)出數(shù)據(jù)、pg_restore恢復(fù)數(shù)據(jù)及ProcessBuilder調(diào)用系統(tǒng)命令,并詳細(xì)解釋了ProcessBuilder、pg_dump與pg_restore的用法、參數(shù)配置及常見問題解決方法
    2026-04-04
  • response文件流輸出文件名中文不顯示的解決

    response文件流輸出文件名中文不顯示的解決

    這篇文章主要介紹了response文件流輸出文件名中文不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)

    SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)

    用戶登錄、注冊(cè)及鑒權(quán)是我們基本所有系統(tǒng)必備的,也是很核心重要的一塊,本文主要介紹了SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • Spring Boot Actuator執(zhí)行器運(yùn)行原理詳解

    Spring Boot Actuator執(zhí)行器運(yùn)行原理詳解

    這篇文章主要介紹了Spring Boot Actuator執(zhí)行器運(yùn)行原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java使用FFmpeg提取音頻的詳細(xì)指南

    Java使用FFmpeg提取音頻的詳細(xì)指南

    FFmpeg 是一個(gè)開源的多媒體處理工具,支持視頻、音頻的編碼、解碼、轉(zhuǎn)換等多種功能,本文將詳細(xì)講解如何使用 FFmpeg 提取音頻,包括常見的音頻格式提取、音頻質(zhì)量調(diào)整、高級(jí)處理操作等,內(nèi)容淺顯易懂,適合初學(xué)者快速掌握,需要的朋友可以參考下
    2024-11-11
  • java 中的volatile關(guān)鍵字

    java 中的volatile關(guān)鍵字

    這篇文章主要介紹了java 中的volatile關(guān)鍵字,volatile在多處理器開發(fā)中保證共享變量的“可見性”??梢娦缘囊馑际钱?dāng)一個(gè)線程修改一個(gè)共享變量時(shí),另一個(gè)一個(gè)線程立馬可以讀到這個(gè)修改的值。下面我們來看看文章的具體介紹內(nèi)容吧

    2021-12-12
  • idea數(shù)據(jù)庫驅(qū)動(dòng)下載失敗的問題及解決

    idea數(shù)據(jù)庫驅(qū)動(dòng)下載失敗的問題及解決

    這篇文章主要介紹了idea數(shù)據(jù)庫驅(qū)動(dòng)下載失敗的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring實(shí)現(xiàn)資源的動(dòng)態(tài)加載和卸載的方法小結(jié)

    Spring實(shí)現(xiàn)資源的動(dòng)態(tài)加載和卸載的方法小結(jié)

    這篇文章主要介紹了Spring實(shí)現(xiàn)資源的動(dòng)態(tài)加載和卸載的方法小結(jié),文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • springBoot整合rabbitmq測(cè)試常用模型小結(jié)

    springBoot整合rabbitmq測(cè)試常用模型小結(jié)

    這篇文章主要介紹了springBoot整合rabbitmq并測(cè)試五種常用模型,本文主要針對(duì)前五種常用模型,在spirngboot框架的基礎(chǔ)上整合rabbitmq并進(jìn)行測(cè)試使用,需要的朋友可以參考下
    2022-01-01
  • 前端與Spring Boot后端無感Token 刷新的完整實(shí)例代碼

    前端與Spring Boot后端無感Token 刷新的完整實(shí)例代碼

    本文詳細(xì)介紹無感Token刷新的核心原理,以及前端Axios攔截器與后端 Spring Boot + MyBatis-Plus + Redis 的完整示例代碼,通過雙 Token、Redis 校驗(yàn)與攔截重試,你可以在保證安全性的同時(shí),給用戶帶來 無感登錄過期刷新的體驗(yàn),感興趣的朋友跟隨小編一起看看吧
    2025-06-06

最新評(píng)論

延津县| 缙云县| 思茅市| 碌曲县| 古蔺县| 勐海县| 平果县| 徐水县| 霸州市| 丘北县| 渝中区| 裕民县| 北安市| 无锡市| 福贡县| 宜昌市| 汤原县| 沈丘县| 阳山县| 道孚县| 木里| 怀柔区| 昌宁县| 咸宁市| 五常市| 阿克苏市| 潼南县| 增城市| 兰州市| 长海县| 奇台县| 伊川县| 淮滨县| 姚安县| 海安县| 沧州市| 右玉县| 榕江县| 襄垣县| 普安县| 读书|