国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java中ArrayList的底層擴容機制和Vector的底層擴容機制,以及ArrayList和Vector的對比與選擇。附源碼

這篇具有很好參考價值的文章主要介紹了Java中ArrayList的底層擴容機制和Vector的底層擴容機制,以及ArrayList和Vector的對比與選擇。附源碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在 Java 的 ArrayList 中,當(dāng)數(shù)組的容量不足以存儲新元素時,會觸發(fā)擴容操作。ArrayList 的底層使用數(shù)組來存儲元素,而擴容機制主要涉及到創(chuàng)建一個更大的數(shù)組,并將現(xiàn)有元素復(fù)制到新數(shù)組中。ArrayList 支持無參擴容和有參擴容兩種機制。

無參擴容機制
無參擴容是指首次的擴容大小是10,后面在元素數(shù)量達(dá)到容量上限時,ArrayList 會創(chuàng)建一個新的數(shù)組,其大小通常是原數(shù)組容量的1.5倍,并將原數(shù)組中的元素復(fù)制到新數(shù)組中。這個過程涉及到創(chuàng)建新數(shù)組、復(fù)制元素等步驟(copyOf方法)。

以下是無參擴容的源碼示例:

//第一步
public boolean add (E e){
	ensureCapacityInternal(size + 1);  // Increments modCount!!
	elementData[size++] = e;
	return true;
}
//第二步
private void ensureCapacityInternal ( int minCapacity){         																								ensureExplicitCapacity(calculateCapacity(elementData, 	minCapacity));
}
//第三步
private static int calculateCapacity (Object[]elementData,int minCapacity){
	if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
		return Math.max(DEFAULT_CAPACITY, minCapacity);
	}//DEFAULT_CAPACITY為10
		return minCapacity;
}
//第四步
private void ensureExplicitCapacity ( int minCapacity){
	modCount++;

	// overflow-conscious code
	if (minCapacity - elementData.length > 0)
		grow(minCapacity);
}
//第五步
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);
}

有參擴容機制
有參擴容是指允許開發(fā)者在添加元素時指定擴容的大小。通過傳遞一個整數(shù)作為參數(shù),ArrayList 會根據(jù)指定的擴容大小進(jìn)行數(shù)組的擴容。后面在元素數(shù)量達(dá)到容量上限時,ArrayList 會創(chuàng)建一個新的數(shù)組,其大小通常是原數(shù)組容量的1.5倍。

有參擴容的源碼示例:

//第一步
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);                                             
    }
}
//第二步
private void ensureCapacityInternal ( int minCapacity){         																								ensureExplicitCapacity(calculateCapacity(elementData, 	minCapacity));
}
//第三步
private static int calculateCapacity (Object[]elementData,int minCapacity){
	if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
		return Math.max(DEFAULT_CAPACITY, minCapacity);
	}//DEFAULT_CAPACITY為10
		return minCapacity;
}
//第四步
private void ensureExplicitCapacity ( int minCapacity){
	modCount++;

	// overflow-conscious code
	if (minCapacity - elementData.length > 0)
		grow(minCapacity);
}
//第五步
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);
}

java.util.Vector 是 Java 中的一種動態(tài)數(shù)組實現(xiàn),與 ArrayList 類似,它也支持無參擴容和有參擴容機制。Vector 是線程安全的,但在多線程環(huán)境下性能較差,已經(jīng)不太推薦使用。

無參擴容機制
無參擴容是指首次的擴容大小默認(rèn)是10,后面在元素數(shù)量達(dá)到容量上限時,Vector 會創(chuàng)建一個新的數(shù)組,其大小通常是原數(shù)組容量的2倍,并將原數(shù)組中的元素復(fù)制到新數(shù)組中。這個過程涉及到創(chuàng)建新數(shù)組、復(fù)制元素等步驟(copyOf方法)。

以下是無參擴容的源碼示例:

//第一步
    public Vector() {
        this(10);
    }
//第二步
    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
//第三步
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
//第四步
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
//第五步
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

有參擴容機制
有參擴容是指允許開發(fā)者在添加元素時指定擴容的大小。通過傳遞一個整數(shù)作為參數(shù),Vector 會根據(jù)指定的擴容大小進(jìn)行數(shù)組的擴容。后面在元素數(shù)量達(dá)到容量上限時,Vector 會創(chuàng)建一個新的數(shù)組,其大小通常是原數(shù)組容量的2倍

有參擴容的源碼示例:

//第一步
    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
//第二步
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);                                            
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }
//第三步
    protected AbstractList() {
    }
//第四步
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
//第五步
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
//第六步
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

小結(jié):
ArrayListVector 都是 Java 集合框架中動態(tài)數(shù)組的實現(xiàn),它們在很多方面非常相似,但也有一些關(guān)鍵的區(qū)別。在選擇使用哪個類時,需要考慮到它們的性能、線程安全性和適用場景等因素。

ArrayList 和 Vector 的對比:

  1. 線程安全性

    • ArrayList:不是線程安全的,多個線程同時訪問和修改 ArrayList 可能會導(dǎo)致并發(fā)問題。
    • Vector:是線程安全的,內(nèi)部使用同步機制來確保多線程下的安全訪問。
  2. 性能

    • ArrayList:由于不需要進(jìn)行額外的同步操作,相對于 Vector 在單線程環(huán)境下性能更好。
    • Vector:由于需要進(jìn)行同步操作,性能相對較差。在多線程環(huán)境下,由于同步開銷,可能也比 ArrayList 性能較差。
  3. 擴容機制

    • ArrayListVector 的擴容機制類似,但 ArrayList 可以通過構(gòu)造函數(shù) ArrayList(int initialCapacity)ensureCapacity(int minCapacity) 方法來設(shè)置初始容量,而 Vector 只能通過構(gòu)造函數(shù)來設(shè)置初始容量。
  4. 適用場景

    • 如果在單線程環(huán)境下使用,且不需要線程安全性,推薦使用 ArrayList
    • 如果在多線程環(huán)境下使用,或者需要考慮線程安全性,可以考慮使用 Vector。但請注意,現(xiàn)代 Java 中更傾向于使用并發(fā)集合(如 ConcurrentHashMap、CopyOnWriteArrayList 等)來實現(xiàn)更高效的線程安全。

如何選擇:

  1. 性能要求:如果性能是首要考慮因素,且在單線程環(huán)境下使用,選擇 ArrayList。如果線程安全性更重要,可以考慮使用其他線程安全的集合,而不是 Vector

  2. 線程安全性:如果需要在線程之間共享數(shù)據(jù),或者在多線程環(huán)境下使用,而且沒有更好的線程安全替代品,可以考慮使用 Vector。但要知道 Vector 的性能會受到影響。

  3. 現(xiàn)代替代品:在現(xiàn)代 Java 中,還有更適合多線程環(huán)境的集合實現(xiàn),如 CopyOnWriteArrayList 或并發(fā)集合框架。這些集合能夠提供更好的性能和線程安全性。

綜上所述,除非有特定的需求,現(xiàn)代 Java 中更傾向于使用其他集合實現(xiàn),而不是直接使用 Vector。在選擇時,需要根據(jù)具體的需求和環(huán)境來權(quán)衡性能和線程安全性。文章來源地址http://www.zghlxwxcb.cn/news/detail-670120.html

到了這里,關(guān)于Java中ArrayList的底層擴容機制和Vector的底層擴容機制,以及ArrayList和Vector的對比與選擇。附源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 源碼分析——ArrayList源碼+擴容機制分析

    ArrayList 的底層是數(shù)組隊列,相當(dāng)于動態(tài)數(shù)組。與 Java 中的數(shù)組相比,它的容量能動態(tài)增長。在添加大量元素前,應(yīng)用程序可以使用 ensureCapacity 操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數(shù)量。 ArrayList 繼承于 AbstractList ,實現(xiàn)了 List , RandomAccess , Cloneable , ja

    2024年02月14日
    瀏覽(19)
  • vector擴容機制

    vector擴容機制

    在學(xué)習(xí)了vector的時候,總說linux下是以二倍擴容的,VS是以1.5倍擴容的。 但是想一想為什么擴容是這樣的呢,為什么不能是3倍或者其他倍數(shù)呢?? 所以帶著這些疑問,接著往下看。 首先,我們要知道vector的擴容機制:當(dāng)向vector插入元素的時候,即當(dāng)_finish == _end_of_storage,可能

    2024年01月15日
    瀏覽(63)
  • c++ vector的擴容機制

    c++ vector的擴容機制

    1、當(dāng)向vector push_back一個元素時,如果此時元素個數(shù)超過了vector的容量,會觸發(fā)擴容 2、擴容的過程是:開辟新空間-拷貝舊空間的元素-釋放舊空間 3、擴容過程中開辟新空間的大小影響著往vector插入元素的效率: 如果新空間大小為舊空間大小+1,也就是邊插入邊擴容,這樣每

    2024年02月10日
    瀏覽(20)
  • C++中STL的vector擴容機制

    C++中STL的vector擴容機制

    前陣子面試的時候,被問到往vector中插入一個數(shù)據(jù)可能會發(fā)生什么? 我答:可能會 擴容 ; 為啥vector支持變長? 我答:它實在堆上動態(tài)申請內(nèi)存,因此有自己的一套擴容機制,可以操作內(nèi)存大小; 它有size()和capacity()記錄當(dāng)前的有效元素個數(shù)和容量, 還有配套的resize()管理實際存放

    2024年02月20日
    瀏覽(19)
  • java面試基礎(chǔ) -- ArrayList 和 LinkedList有什么區(qū)別, ArrayList和Vector呢?

    java面試基礎(chǔ) -- ArrayList 和 LinkedList有什么區(qū)別, ArrayList和Vector呢?

    目錄 基本介紹 有什么不同?? ArrayList的擴容機制 ArrayLIst的基本使用 ArrayList和Vector 還記得我們的java集合框架嗎, 我們來復(fù)習(xí)一下, 如圖: ? ? ? ? ?可以看出來 ArrayList和LinkedList 都是具體類, 他們都是接口List的實現(xiàn)類. 但是他們底層的邏輯是不同的, 相信學(xué)過這個的應(yīng)該大概有個

    2024年02月12日
    瀏覽(22)
  • java 數(shù)據(jù)結(jié)構(gòu) ArrayList源碼底層 LinkedList 底層源碼 迭代器底層

    java 數(shù)據(jù)結(jié)構(gòu) ArrayList源碼底層 LinkedList 底層源碼 迭代器底層

    對于數(shù)據(jù)結(jié)構(gòu)我這邊只告訴你右邊框框里的 棧的特點:后進(jìn)先出,先進(jìn)后出,入棧也成為壓棧,出棧也成為彈棧 棧就像一個彈夾 隊列先進(jìn)先出后進(jìn)后出 隊列像排隊 鏈表查詢滿 但是增刪快(相對于數(shù)組而言) 拓展:還有一個雙向鏈表 他在查詢元素的時候更快些,因為他在拿到一個元素

    2024年02月05日
    瀏覽(25)
  • Java實現(xiàn)ArrayList和底層源碼講解

    Java實現(xiàn)ArrayList和底層源碼講解

    ?????? 點進(jìn)來你就是我的人了 博主主頁: ??????戳一戳,歡迎大佬指點! 歡迎志同道合的朋友一起加油喔 ?????? 目錄 一. 模擬實現(xiàn)ArrayList?編輯 1.定義順序順序表 2.?函數(shù)實現(xiàn) (1) 打印順序表display()函數(shù) (2) 新增元素函數(shù)add() (默認(rèn)在數(shù)組最后新增) (3) 在 pos 位置新增元

    2023年04月16日
    瀏覽(20)
  • [C++歷練之路]vector的介紹以及底層模擬實現(xiàn)

    [C++歷練之路]vector的介紹以及底層模擬實現(xiàn)

    W...Y的主頁 ?? 代碼倉庫分享??? ??前言: 我們學(xué)習(xí)了STL中的string以及其所有重要接口并進(jìn)行了模擬實現(xiàn),但是STL中包含的內(nèi)容不止于此。學(xué)習(xí)了string之后繼續(xù)學(xué)習(xí)STL中的vector,學(xué)習(xí)成本會大大降低,因為他們非現(xiàn)類似,現(xiàn)在就讓我們進(jìn)入vector的世界中吧! 目錄 vector的介紹

    2024年02月04日
    瀏覽(31)
  • 【JAVA語言-第15話】集合框架(二)——List、ArrayList、LinkedList、Vector集合

    【JAVA語言-第15話】集合框架(二)——List、ArrayList、LinkedList、Vector集合

    目錄 List集合 1.1?概述 1.2 特點 1.3 常用方法 1.4?ArrayList集合 1.4.1 概述? 1.4.2 練習(xí) 1.5 LinkedList集合? 1.5.1 概述 1.5.2 特點 1.5.3 常用方法 1.5.4 練習(xí) 1.6?Vector類 1.6.1 概述 1.6.2 練習(xí) 1.7 List實現(xiàn)類的異同點 ????????java.util.List: List是一個接口,它繼承自Collection接口。 常用的實現(xiàn)

    2024年01月25日
    瀏覽(22)
  • HashMap的擴容機制、初始化容量大小的選擇、容量為什么是2的次冪

    HashMap的擴容機制、初始化容量大小的選擇、容量為什么是2的次冪

    先來看看HashMap中的成員屬性 解釋: size 當(dāng)前的容器中Entry的數(shù)量,也就是當(dāng)前K-V的數(shù)量 loadFactory 裝載因子,用來衡量HashMap滿的程度, loadFactory的默認(rèn)值是0.75 threshold 臨界值, 當(dāng)實際KV數(shù)量超過threshold時,就會觸發(fā)擴容機制 。 threshold = capatity * loadFactory 容量capatity 除了以上這

    2023年04月26日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包