java中Vector的詳細(xì)說明
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)點:
- ?線程安全?:最大的優(yōu)點,在不需要額外代碼的情況下,即可用于多線程場景。
- ?使用簡單?:作為動態(tài)數(shù)組,其 API 直觀易用,避免了原始數(shù)組的固定大小限制。
缺點:
- ?性能開銷?:?這是最關(guān)鍵的缺點。同步(
synchronized)帶來了巨大的性能代價。每次方法調(diào)用都需要獲取和釋放鎖,這在單線程環(huán)境下是完全不必要的開銷,會導(dǎo)致程序變慢。 - ?過時的設(shè)計?:在 Java 1.2 引入更現(xiàn)代的集合框架(如
ArrayList,HashMap)之后,Vector雖然被保留了,但通常被認(rèn)為是一種“遺留類”(Legacy Class)。它的方法名(如addElement,elementAt)也沒有遵循新的集合接口約定(如add,get),盡管為了兼容它也實現(xiàn)了這些新方法。 - ?不如現(xiàn)代的并發(fā)集合?:即使在需要線程安全的場景下,Java 5 引入的
java.util.concurrent包中的集合類(如CopyOnWriteArrayList,ConcurrentHashMap)通常提供了更優(yōu)的性能和更精細(xì)的鎖策略(如讀寫鎖、寫時復(fù)制)。
4. Vector vs ArrayList
這是最常被問到的問題。ArrayList是 Vector的非同步現(xiàn)代替代品。
特性 | Vector | ArrayList |
|---|---|---|
?線程安全? | ?是? (同步方法) | ?否? |
?性能? | 較低 (因同步開銷) | ?較高? (無同步開銷) |
?擴(kuò)容策略? | 默認(rèn)2倍,可指定增量 | 默認(rèn)1.5倍 ( |
?歷史? | JDK 1.0,遺留類 | JDK 1.2,現(xiàn)代集合框架主力 |
?迭代器? |
|
|
?推薦使用? | 極少,僅在遺留系統(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)文章
Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境全過程
眾所周知Ubuntu是一種基于Linux的操作系統(tǒng),它提供了一個穩(wěn)定、安全和易于使用的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法
本文主要介紹了SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
java 數(shù)據(jù)結(jié)構(gòu)并查集詳解
并查集是一種用來管理元素分組情況的數(shù)據(jù)結(jié)構(gòu)。并查集可以高效地進(jìn)行如下操作。本文將通過Java實現(xiàn)并查集,感興趣的小伙伴可以了解一下2022-03-03
Java使用Apache POI庫讀取Excel表格文檔的示例
POI庫是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫,這里我們就來看一下Java使用Apache POI庫讀取Excel表格文檔的示例:2016-06-06
SpringDataJPA之Specification復(fù)雜查詢實戰(zhàn)
這篇文章主要介紹了SpringDataJPA之Specification復(fù)雜查詢實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

