Java中Vector和List的區別

一、Vector和List的概述

在Java中,Vector和List都是用於存儲一組元素的容器,它們都實現了List接口,因此擁有List特徵:元素可重複,有序。但是,它們之間還存在一些差異。

import java.util.*;

public class Vector_vs_List {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Java");
        vector.add("Python");
        vector.add("C++");
        vector.add("C#");

        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("C#");

        System.out.println("Vector: " + vector);
        System.out.println("List: " + list);
    }
}

以上代碼創建了一個Vector和一個List容器,並將一些元素添加到容器中,然後輸出它們。運行結果:

Vector: [Java, Python, C++, C#]
List: [Java, Python, C++, C#]

Vector和List存儲的數據是一樣的,但是它們的內部實現機制有所不同,下面我們分別進行探究。

二、Vector和List的內部實現

1. Vector的內部實現

Vector是線程安全的,很早就出現在Java中,它的內部實現是採用數組來存儲元素。

當Vector容量不足時,會進行擴容操作,即創建一個更大的數組,將原數組的內容複製到新數組中,增加容量。

默認情況下,Vector容量每次擴增為原來的2倍。即當Vector容量不足時,Vector會創建一個新的長度是原長度2倍的底層數組,將原數組元素複製到新數組,然後再將新增元素添加到數組中。如果Vector中的元素數量不斷增加,就需要不斷進行擴容操作,而且每次擴容都要複製數組,降低了性能。

以下是Vector擴容的代碼示例:

private void grow(int minCapacity) {
    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);
}

其中,minCapacity指的是需要容器具備的最小容量,而capacityIncrement是Vector每次擴容的容量增量。

2. List的內部實現

List的實現類有很多,比如ArrayList、LinkedList等,其中ArrayList是最常用的。

ArrayList也是用數組來存儲元素,但它的擴容機制不同於Vector。當ArrayList容量不足時,會創建一個新數組,並將原數組的內容複製到新數組中,同時利用System.arraycopy方法,實現數組的複製,以此來增加容量。

與Vector不同的是,ArrayList的默認擴容因子是1.5倍,而非2倍。

以下是ArrayList擴容的代碼示例:

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

其中,”>>”是位運算符中的右移運算符。如:4 >> 1的結果是2。

三、Vector和List的區別

1. 線程安全性

Vector是線程安全的,因此可以在並發環境中使用。但是,由於線程安全的需求越來越多地被提出,Java官方也在後來的版本中提供了其他數據結構,如ConcurrentHashMap等,替代了許多早期的容器功能。

List是非線程安全的,也就是說,當多個線程同時對一個List進行操作時,可能會破壞原來的數據結構。此時可以採用線程安全的List實現,如CopyOnWriteArrayList。

2. 性能

由於Vector在擴容時必須要複製其內部數組,因此在元素數量較大時,其性能會受到影響。

ArrayList的擴容機制雖然相對於Vector更為高效,但由於其底層還是採用數組實現,因此在插入或刪除元素時,需要移動整個數組的元素,性能也是比LinkedList要低的。

LinkedList在進行插入和刪除操作時,只需要調整前後元素的指針,因此實際上會更為高效。不過,它也有自己的缺點,就是它不支持隨機訪問,如果需要訪問某個元素,只能從頭節點開始不斷遍歷。

3. 使用場景

如果在操作較少的情況下,選擇使用ArrayList可能會更高效,它支持快速隨機訪問,不需要像LinkedList那樣進行遍歷。但如果插入和刪除操作較為頻繁,那就選擇LinkedList更為合適。

另外,如果需要在多線程環境中使用,可以選擇使用ConcurrentHashMap等線程安全的容器。

四、總結

Vector和List都是用於存儲元素的容器,它們的底層實現機制略有不同,Vector的擴容機制性能較低,而ArrayList雖然擴容機制較為高效,但其在插入和刪除操作時也有性能問題。另外,在多線程環境下,需要使用線程安全的容器。

import java.util.*;

public class Vector_vs_List {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Java");
        vector.add("Python");
        vector.add("C++");
        vector.add("C#");

        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("C#");

        System.out.println("Vector: " + vector);
        System.out.println("List: " + list);
    }
}

原創文章,作者:HBMV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/137147.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HBMV的頭像HBMV
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Tensor to List的使用

    Tensor to List是TensorFlow框架提供的一個非常有用的函數,在很多的深度學習模型中都會用到。它的主要功能是將TensorFlow中的張量(Tensor)轉換為P…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論