欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的ArrayList(擴容機制)詳解

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

背景介紹

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

適用于什么場景?

檢索比較多的場景

ArrayList特點

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

實戰(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");//第一個,索引下標(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)索引位置的元素自動向后移動

    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)的起始位置截取一段元素形成一個新的集合,截取的時候,包含開始的索引不包含結(jié)束時的索引
    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擴容機制

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

又沒有定義固定大小直接放進去不就好了嗎?

add方法添加分為三步:

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

解答:

用戶不需要提前定義大小,那是因為底層默認(rèn)已經(jīng)定義好了大小。

其實是有一個邊界值的,并不是無限增長的。

使用時增加,是因為底層有擴展因子(擴容因子是1.5),當(dāng)數(shù)量達到數(shù)組的百分之多少的時候就會擴容。ArrayList默認(rèn)的初始大小是10

問題:大家可以思考思考為什么ArrayList底層擴容因子是1.5?為什么不是1.32.4……?

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

下面是一些原因:

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

綜上所述,ArrayList的特點如下

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

總結(jié)

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

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

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

相關(guān)文章

  • java創(chuàng)建子類對象設(shè)置并調(diào)用父類的變量操作

    java創(chuàng)建子類對象設(shè)置并調(diào)用父類的變量操作

    這篇文章主要介紹了java創(chuàng)建子類對象設(shè)置并調(diào)用父類的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring MVC的優(yōu)點與核心接口_動力節(jié)點Java學(xué)院整理

    Spring MVC的優(yōu)點與核心接口_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Spring MVC的優(yōu)點與核心接口,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java?@Accessors注解圖文詳解

    Java?@Accessors注解圖文詳解

    @Accessors用于改變@Data生成的getter和setter方法的生成結(jié)果,下面這篇文章主要給大家介紹了關(guān)于Java?@Accessors注解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 解讀Integer類的parseInt和valueOf的區(qū)別

    解讀Integer類的parseInt和valueOf的區(qū)別

    這篇文章主要介紹了解讀Integer類的parseInt和valueOf的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java結(jié)構(gòu)型模式之代理模式詳解

    Java結(jié)構(gòu)型模式之代理模式詳解

    這篇文章主要介紹了Java結(jié)構(gòu)型模式之代理模式,代理模式是常用的java設(shè)計模式,他的特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等
    2023-02-02
  • SpringBoot多數(shù)據(jù)源配置完整指南

    SpringBoot多數(shù)據(jù)源配置完整指南

    在復(fù)雜的企業(yè)應(yīng)用中,經(jīng)常需要連接多個數(shù)據(jù)庫,Spring Boot 提供了靈活的多數(shù)據(jù)源配置方式,以下是詳細(xì)的實現(xiàn)方案,需要的朋友可以參考下
    2025-04-04
  • Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解

    Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解

    這篇文章主要介紹了Intellij IDEA 配置Subversion插件實現(xiàn)步驟詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • mybatis in查詢條件過長的解決方案

    mybatis in查詢條件過長的解決方案

    這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java基于servlet的文件異步上傳

    java基于servlet的文件異步上傳

    本篇文章主要介紹了java基于servlet的文件異步上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • 詳解Java 序列化與反序列化(Serialization)

    詳解Java 序列化與反序列化(Serialization)

    這篇文章主要介紹了Java 序列化與反序列化(Serialization),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí) 吧
    2019-03-03

最新評論