java中Vector的詳細(xì)說(shuō)明
1. Vector 是什么?
Vector是 Java 早期版本(從 JDK 1.0 開(kāi)始)就存在的一個(gè)動(dòng)態(tài)數(shù)組實(shí)現(xiàn)。它位于 java.util包中,是 Java 集合框架(Java Collections Framework, JCF)的一部分。
?本質(zhì)?:一個(gè)可以根據(jù)需要自動(dòng)增長(zhǎng)和縮小的對(duì)象數(shù)組。
?特點(diǎn)?:
- ?有序(Ordered)??:元素按照插入的順序存放,可以通過(guò)整數(shù)索引(從 0 開(kāi)始)精確地訪問(wèn)每個(gè)元素。
- ?可重復(fù)?:允許包含重復(fù)的元素。
- ?線程安全(Synchronized)??:這是
Vector最顯著的特點(diǎn)之一。其絕大多數(shù)公共方法(如add,get,remove)都使用了synchronized關(guān)鍵字修飾,保證了在多線程環(huán)境下,同一時(shí)間只有一個(gè)線程能對(duì) Vector 實(shí)例進(jìn)行修改或讀取,從而避免了數(shù)據(jù)的不一致性。
2. 核心特性詳解
a) 動(dòng)態(tài)擴(kuò)容
這是 Vector和原始數(shù)組最根本的區(qū)別。你無(wú)需在創(chuàng)建時(shí)指定最終的大小,它會(huì)自動(dòng)管理容量。
- ?初始容量(Initial Capacity)??:創(chuàng)建
Vector時(shí)內(nèi)部的數(shù)組大小。默認(rèn)是 ?10。 - ?擴(kuò)容增量(Capacity Increment)??:可以指定一個(gè)增量值。當(dāng)需要擴(kuò)容時(shí),新的容量將是
舊容量 + 增量值。如果創(chuàng)建時(shí)未指定增量(或指定為 0),則默認(rèn)策略是擴(kuò)容為原來(lái)的 2 倍?(newCapacity = oldCapacity * 2)。 - ?擴(kuò)容時(shí)機(jī)?:當(dāng)嘗試添加一個(gè)新元素(例如
add(e))并且當(dāng)前元素?cái)?shù)量已經(jīng)等于內(nèi)部數(shù)組的長(zhǎng)度時(shí),就會(huì)觸發(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個(gè)元素時(shí),容量從10擴(kuò)到20
}b) 線程安全
正如之前提到的,Vector的方法大多是同步的。這意味著它在多線程環(huán)境下是安全的,你可以多個(gè)線程同時(shí)操作一個(gè) Vector而不會(huì)破壞其內(nèi)部狀態(tài)(如不會(huì)造成數(shù)據(jù)覆蓋)。
?示例代碼片段(查看源碼):??
// Vector 的 add 方法源碼大致長(zhǎng)這樣:
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)缺點(diǎn)分析
優(yōu)點(diǎn):
- ?線程安全?:最大的優(yōu)點(diǎn),在不需要額外代碼的情況下,即可用于多線程場(chǎng)景。
- ?使用簡(jiǎn)單?:作為動(dòng)態(tài)數(shù)組,其 API 直觀易用,避免了原始數(shù)組的固定大小限制。
缺點(diǎn):
- ?性能開(kāi)銷?:?這是最關(guān)鍵的缺點(diǎn)。同步(
synchronized)帶來(lái)了巨大的性能代價(jià)。每次方法調(diào)用都需要獲取和釋放鎖,這在單線程環(huán)境下是完全不必要的開(kāi)銷,會(huì)導(dǎo)致程序變慢。 - ?過(guò)時(shí)的設(shè)計(jì)?:在 Java 1.2 引入更現(xiàn)代的集合框架(如
ArrayList,HashMap)之后,Vector雖然被保留了,但通常被認(rèn)為是一種“遺留類”(Legacy Class)。它的方法名(如addElement,elementAt)也沒(méi)有遵循新的集合接口約定(如add,get),盡管為了兼容它也實(shí)現(xiàn)了這些新方法。 - ?不如現(xiàn)代的并發(fā)集合?:即使在需要線程安全的場(chǎng)景下,Java 5 引入的
java.util.concurrent包中的集合類(如CopyOnWriteArrayList,ConcurrentHashMap)通常提供了更優(yōu)的性能和更精細(xì)的鎖策略(如讀寫(xiě)鎖、寫(xiě)時(shí)復(fù)制)。
4. Vector vs ArrayList
這是最常被問(wèn)到的問(wèn)題。ArrayList是 Vector的非同步現(xiàn)代替代品。
特性 | Vector | ArrayList |
|---|---|---|
?線程安全? | ?是? (同步方法) | ?否? |
?性能? | 較低 (因同步開(kāi)銷) | ?較高? (無(wú)同步開(kāi)銷) |
?擴(kuò)容策略? | 默認(rèn)2倍,可指定增量 | 默認(rèn)1.5倍 ( |
?歷史? | JDK 1.0,遺留類 | JDK 1.2,現(xiàn)代集合框架主力 |
?迭代器? |
|
|
?推薦使用? | 極少,僅在遺留系統(tǒng)或非常簡(jiǎn)單的多線程場(chǎng)景 | ?絕大多數(shù)單線程場(chǎng)景的首選? |
5. 如何使用 Vector?
盡管不推薦在新項(xiàng)目中使用,但了解其 API 仍有必要。
?創(chuàng)建 Vector:??
// 1. 默認(rèn)構(gòu)造:容量10,擴(kuò)容時(shí)容量翻倍
Vector<String> vec1 = new Vector<>();
// 2. 指定初始容量
Vector<String> vec2 = new Vector<>(100);
// 3. 指定初始容量和擴(kuò)容增量
Vector<String> vec3 = new Vector<>(100, 10); // 每次擴(kuò)容增加10
// 4. 通過(guò)其他集合創(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(); // 元素?cái)?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)代開(kāi)發(fā)中的替代方案和建議
?單線程環(huán)境?:
- ?絕對(duì)首選 ArrayList。它沒(méi)有同步開(kāi)銷,性能遠(yuǎn)超
Vector。
?多線程環(huán)境?:
- ?需要同步的 List?:可以使用
Collections.synchronizedList(new ArrayList())來(lái)包裝一個(gè)ArrayList,這樣得到的 List 是同步的。這比直接使用Vector更靈活,因?yàn)槟憧梢栽谛枰綍r(shí)再包裝,不需要時(shí)就用原始的ArrayList。 - ?高并發(fā)讀,少寫(xiě)?:考慮使用
CopyOnWriteArrayList。它在寫(xiě)操作時(shí)復(fù)制整個(gè)新數(shù)組,讀操作無(wú)需加鎖,性能極高。 - ?需要更復(fù)雜的并發(fā)操作?:使用
java.util.concurrent包下的其他并發(fā)集合類。
?示例:使用 Collections.synchronizedList?
List<String> syncedList = Collections.synchronizedList(new ArrayList<>());
// 在迭代時(shí),你必須手動(dòng)同步!
synchronized(syncedList) {
Iterator<String> i = syncedList.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}總結(jié)
Vector是一個(gè)線程安全的、動(dòng)態(tài)擴(kuò)容的數(shù)組實(shí)現(xiàn)。- 它的同步特性導(dǎo)致性能較差,是其在現(xiàn)代開(kāi)發(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ì)說(shuō)明的文章就介紹到這了,更多相關(guān)java Vector內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Log4j關(guān)閉Spring和Hibernate日志打印方式
這篇文章主要介紹了Log4j關(guān)閉Spring和Hibernate日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
idea2020.3測(cè)試評(píng)價(jià)及感受
idea2020.3版本這次變化最大的也就是 UI了完全拋棄了之前一直使用的模板更改成了新的樣式,感興趣的朋友快來(lái)下載體驗(yàn)下吧2020-10-10
詳解SpringBoot讀取resource目錄下properties文件的常見(jiàn)方式
這篇文章主要介紹了SpringBoot讀取resource目錄下properties文件的常見(jiàn)方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Java?SM2加密相關(guān)實(shí)現(xiàn)與簡(jiǎn)單原理詳解
SM2算法可以用較少的計(jì)算能力提供比RSA算法更高的安全強(qiáng)度,而所需的密鑰長(zhǎng)度卻遠(yuǎn)比RSA算法低,這篇文章主要給大家介紹了關(guān)于Java?SM2加密相關(guān)實(shí)現(xiàn)與簡(jiǎn)單原理的相關(guān)資料,需要的朋友可以參考下2024-01-01

