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

java中Vector的詳細(xì)說明

 更新時間:2025年10月20日 11:16:02   作者:悟能不能悟  
Vector是Java早期的線程安全動態(tài)數(shù)組,支持自動擴(kuò)容和有序可重復(fù)元素,因同步機(jī)制性能較低,已被ArrayList等替代,現(xiàn)代開發(fā)中,推薦使用ArrayList或并發(fā)容器而非Vector

1. Vector 是什么?

Vector是 Java 早期版本(從 JDK 1.0 開始)就存在的一個動態(tài)數(shù)組實現(xiàn)。它位于 java.util包中,是 Java 集合框架(Java Collections Framework, JCF)的一部分。

?本質(zhì)?:一個可以根據(jù)需要自動增長和縮小的對象數(shù)組。

?特點?:

  • ?有序(Ordered)??:元素按照插入的順序存放,可以通過整數(shù)索引(從 0 開始)精確地訪問每個元素。
  • ?可重復(fù)?:允許包含重復(fù)的元素。
  • ?線程安全(Synchronized)??:這是 Vector最顯著的特點之一。其絕大多數(shù)公共方法(如 add, get, remove)都使用了 synchronized關(guān)鍵字修飾,保證了在多線程環(huán)境下,同一時間只有一個線程能對 Vector 實例進(jìn)行修改或讀取,從而避免了數(shù)據(jù)的不一致性。

2. 核心特性詳解

a) 動態(tài)擴(kuò)容

這是 Vector和原始數(shù)組最根本的區(qū)別。你無需在創(chuàng)建時指定最終的大小,它會自動管理容量。

  • ?初始容量(Initial Capacity)??:創(chuàng)建 Vector時內(nèi)部的數(shù)組大小。默認(rèn)是 ?10。
  • ?擴(kuò)容增量(Capacity Increment)??:可以指定一個增量值。當(dāng)需要擴(kuò)容時,新的容量將是 舊容量 + 增量值。如果創(chuàng)建時未指定增量(或指定為 0),則默認(rèn)策略是擴(kuò)容為原來的 2 倍?(newCapacity = oldCapacity * 2)。
  • ?擴(kuò)容時機(jī)?:當(dāng)嘗試添加一個新元素(例如 add(e))并且當(dāng)前元素數(shù)量已經(jīng)等于內(nèi)部數(shù)組的長度時,就會觸發(fā)擴(kuò)容操作。

?示例:??

Vector<String> vector = new Vector<>(); // 初始容量=10, 增量=0(默認(rèn)2倍擴(kuò)容)
for (int i = 0; i < 11; i++) {
    vector.add("Element " + i); // 添加第11個元素時,容量從10擴(kuò)到20
}

b) 線程安全

正如之前提到的,Vector的方法大多是同步的。這意味著它在多線程環(huán)境下是安全的,你可以多個線程同時操作一個 Vector而不會破壞其內(nèi)部狀態(tài)(如不會造成數(shù)據(jù)覆蓋)。

?示例代碼片段(查看源碼):??

// Vector 的 add 方法源碼大致長這樣:
public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1); // 檢查并擴(kuò)容
    elementData[elementCount++] = e;
    return true;
}
 
// get 方法也是同步的
public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);
    return elementData(index);
}

3. 優(yōu)缺點分析

優(yōu)點:

  1. ?線程安全?:最大的優(yōu)點,在不需要額外代碼的情況下,即可用于多線程場景。
  2. ?使用簡單?:作為動態(tài)數(shù)組,其 API 直觀易用,避免了原始數(shù)組的固定大小限制。

缺點:

  1. ?性能開銷?:?這是最關(guān)鍵的缺點。同步(synchronized)帶來了巨大的性能代價。每次方法調(diào)用都需要獲取和釋放鎖,這在單線程環(huán)境下是完全不必要的開銷,會導(dǎo)致程序變慢。
  2. ?過時的設(shè)計?:在 Java 1.2 引入更現(xiàn)代的集合框架(如 ArrayList, HashMap)之后,Vector雖然被保留了,但通常被認(rèn)為是一種“遺留類”(Legacy Class)。它的方法名(如 addElement, elementAt)也沒有遵循新的集合接口約定(如 add, get),盡管為了兼容它也實現(xiàn)了這些新方法。
  3. ?不如現(xiàn)代的并發(fā)集合?:即使在需要線程安全的場景下,Java 5 引入的 java.util.concurrent包中的集合類(如 CopyOnWriteArrayList, ConcurrentHashMap)通常提供了更優(yōu)的性能和更精細(xì)的鎖策略(如讀寫鎖、寫時復(fù)制)。

4. Vector vs ArrayList

這是最常被問到的問題。ArrayListVector的非同步現(xiàn)代替代品。

特性

Vector

ArrayList

?線程安全?

?? (同步方法)

??

?性能?

較低 (因同步開銷)

?較高? (無同步開銷)

?擴(kuò)容策略?

默認(rèn)2倍,可指定增量

默認(rèn)1.5倍 (int newCapacity = oldCapacity + (oldCapacity >> 1))

?歷史?

JDK 1.0,遺留類

JDK 1.2,現(xiàn)代集合框架主力

?迭代器?

Fail-fast,但枚舉器不是

Fail-fast

?推薦使用?

極少,僅在遺留系統(tǒng)或非常簡單的多線程場景

?絕大多數(shù)單線程場景的首選?

5. 如何使用 Vector?

盡管不推薦在新項目中使用,但了解其 API 仍有必要。

?創(chuàng)建 Vector:??

// 1. 默認(rèn)構(gòu)造:容量10,擴(kuò)容時容量翻倍
Vector<String> vec1 = new Vector<>();
 
// 2. 指定初始容量
Vector<String> vec2 = new Vector<>(100);
 
// 3. 指定初始容量和擴(kuò)容增量
Vector<String> vec3 = new Vector<>(100, 10); // 每次擴(kuò)容增加10
 
// 4. 通過其他集合創(chuàng)建
List<String> list = Arrays.asList("A", "B", "C");
Vector<String> vec4 = new Vector<>(list);

?基本操作:??

Vector<Integer> vector = new Vector<>();
 
// 添加元素
vector.add(10);
vector.add(20);
vector.add(1, 15); // 在索引1處插入
 
// 獲取元素
int element = vector.get(0); // 10
 
// 修改元素
vector.set(0, 100); // 將索引0改為100
 
// 刪除元素
vector.remove(0); // 刪除索引0的元素
vector.remove(Integer.valueOf(20)); // 刪除值為20的元素
 
// 大小和容量
int size = vector.size(); // 元素數(shù)量
int capacity = vector.capacity(); // 當(dāng)前底層數(shù)組的容量
 
// 遍歷 (推薦方式)
for (Integer num : vector) {
    System.out.println(num);
}
 
// 枚舉器 (古老的方式,不推薦)
Enumeration<Integer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
    System.out.println(enumeration.nextElement());
}

6. 現(xiàn)代開發(fā)中的替代方案和建議

?單線程環(huán)境?:

  • ?絕對首選 ArrayList。它沒有同步開銷,性能遠(yuǎn)超 Vector

?多線程環(huán)境?:

  • ?需要同步的 List?:可以使用 Collections.synchronizedList(new ArrayList())來包裝一個 ArrayList,這樣得到的 List 是同步的。這比直接使用 Vector更靈活,因為你可以在需要同步時再包裝,不需要時就用原始的 ArrayList
  • ?高并發(fā)讀,少寫?:考慮使用 CopyOnWriteArrayList。它在寫操作時復(fù)制整個新數(shù)組,讀操作無需加鎖,性能極高。
  • ?需要更復(fù)雜的并發(fā)操作?:使用 java.util.concurrent包下的其他并發(fā)集合類。

?示例:使用 Collections.synchronizedList?

List<String> syncedList = Collections.synchronizedList(new ArrayList<>());
 
// 在迭代時,你必須手動同步!
synchronized(syncedList) {
    Iterator<String> i = syncedList.iterator();
    while (i.hasNext()) {
        System.out.println(i.next());
    }
}

總結(jié)

  • Vector是一個線程安全的、動態(tài)擴(kuò)容的數(shù)組實現(xiàn)。
  • 它的同步特性導(dǎo)致性能較差,是其在現(xiàn)代開發(fā)中不被推薦的主要原因。
  • 單線程環(huán)境中,?總是優(yōu)先使用 ArrayList
  • 多線程環(huán)境中,優(yōu)先考慮 Collections.synchronizedList()、CopyOnWriteArrayList或其他 java.util.concurrent包下的并發(fā)容器,而不是 Vector。

理解 Vector更多的是為了理解 Java 集合框架的歷史和線程安全的概念,而不是為了在新代碼中使用它。

到此這篇關(guān)于java中Vector的詳細(xì)說明的文章就介紹到這了,更多相關(guān)java Vector內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論