Java?Vector類應(yīng)用場景
Vector 是 Java 中的一個經(jīng)典集合類,位于 java.util 包中。它是一個 動態(tài)數(shù)組,允許存儲任意類型的對象,并支持動態(tài)調(diào)整大小。與 ArrayList 類似,但 Vector 的所有方法都是 線程安全的,適用于多線程環(huán)境。以下是 Vector 類的詳細介紹:
一、Vector的核心特性
1. 動態(tài)數(shù)組
Vector內(nèi)部通過數(shù)組實現(xiàn),支持動態(tài)擴容和縮容。- 當元素數(shù)量超過當前數(shù)組容量時,會自動擴容(默認擴容為當前容量的 2 倍)。
- 支持隨機訪問(通過索引直接獲取元素),實現(xiàn)
RandomAccess接口。
2. 線程安全
- 所有方法(如
add、get、remove)都通過synchronized關(guān)鍵字修飾,確保多線程環(huán)境下的線程安全。 - 同步鎖粒度:對整個
Vector對象加鎖,可能導(dǎo)致性能開銷較大。
3. 允許重復(fù)元素和null值
- 與
ArrayList一樣,Vector允許存儲重復(fù)元素和null值。
4. 序列化支持
- 實現(xiàn)
Serializable接口,支持對象序列化,可以通過流進行讀寫。
5. 實現(xiàn)的接口
List<E>:提供列表的基本操作(增刪查改)。RandomAccess:支持快速隨機訪問。Cloneable:支持克隆操作。Serializable:支持序列化。
二、Vector的構(gòu)造函數(shù)
| 構(gòu)造函數(shù) | 描述 |
|---|---|
Vector() | 創(chuàng)建一個空的 Vector,初始容量為 10。 |
Vector(int initialCapacity) | 指定初始容量,無容量增量(capacityIncrement 為 0)。 |
Vector(int initialCapacity, int capacityIncrement) | 指定初始容量和容量增量。每次擴容時,容量增加 capacityIncrement 的值。若 capacityIncrement <= 0,則擴容為當前容量的 2 倍。 |
Vector(Collection<? extends E> c) | 使用指定集合初始化 Vector。 |
示例代碼:
// 默認構(gòu)造函數(shù)
Vector<String> vector1 = new Vector<>();
// 指定初始容量
Vector<String> vector2 = new Vector<>(20);
// 指定初始容量和容量增量
Vector<String> vector3 = new Vector<>(10, 5);
// 從集合初始化
Vector<String> vector4 = new Vector<>(Arrays.asList("A", "B", "C"));三、Vector的常用方法
1. 添加元素
add(E e):將元素添加到Vector末尾。addElement(E obj):與add功能相同(Vector 特有的方法)。insertElementAt(E obj, int index):在指定位置插入元素。
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.addElement("Banana");
vector.insertElementAt("Cherry", 1);
System.out.println(vector); // [Apple, Cherry, Banana]2. 刪除元素
remove(int index):刪除指定位置的元素。remove(Object o):刪除第一次出現(xiàn)的指定元素。removeElement(Object obj):與remove(Object o)功能相同。removeAllElements():清空所有元素。
vector.remove(1); // 刪除索引為1的元素
vector.remove("Apple"); // 刪除元素"Apple"
vector.removeAllElements(); // 清空Vector3. 獲取和修改元素
get(int index):獲取指定索引的元素。set(int index, E element):替換指定索引的元素。elementAt(int index):與get功能相同(Vector 特有的方法)。setElementAt(E obj, int index):與set功能相同。
String fruit = vector.get(0); // 獲取第一個元素 vector.set(1, "Blueberry"); // 替換第二個元素
4. 容量和大小
size():返回當前元素數(shù)量。capacity():返回當前數(shù)組的容量。ensureCapacity(int minCapacity):確保容量至少為minCapacity。trimToSize():將數(shù)組容量調(diào)整為當前元素數(shù)量。
System.out.println(vector.size()); // 輸出元素數(shù)量 System.out.println(vector.capacity()); // 輸出當前容量
四、Vector的線程安全機制
1. 同步方法
- 所有方法通過
synchronized關(guān)鍵字修飾,確保同一時刻只有一個線程訪問。 - 示例:
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
2. 優(yōu)點
- 簡單易用,無需手動同步。
- 多線程環(huán)境下無需額外加鎖。
3. 缺點
- 性能開銷:每次方法調(diào)用都需要獲取鎖,高并發(fā)下性能較低。
- 鎖粒度粗:整個
Vector被加鎖,即使只操作單個元素,也會阻塞其他線程。
五、Vector的擴容機制
1. 初始容量
- 默認初始容量為 10(若未指定)。
- 可通過構(gòu)造函數(shù)自定義初始容量。
2. 擴容策略
- 默認擴容:若
capacityIncrement <= 0,容量翻倍(newCapacity = oldCapacity * 2)。 - 指定擴容增量:容量增加
capacityIncrement(newCapacity = oldCapacity + capacityIncrement)。
示例:
Vector<Integer> vector = new Vector<>(5, 3); // 初始容量5,增量3
for (int i = 0; i < 10; i++) {
vector.add(i);
}
System.out.println(vector.capacity()); // 輸出 11(5 → 5+3=8 → 8+3=11)六、Vector與ArrayList的對比
| 特性 | Vector | ArrayList |
|---|---|---|
| 線程安全 | ? 是(方法級同步) | ? 否 |
| 性能 | 較低(同步鎖開銷) | 高 |
| 擴容策略 | 默認擴容為 2 倍 | 擴容為 1.5 倍 |
| 適用場景 | 多線程環(huán)境 | 單線程或需手動同步的場景 |
| 替代方案 | CopyOnWriteArrayList、Collections.synchronizedList | — |
七、Vector的使用注意事項
1. 快速失敗的迭代器
- 使用
Iterator遍歷時,如果在迭代過程中修改Vector(如add、remove),會拋出ConcurrentModificationException。 - 解決方案:使用
Enumeration或在遍歷時對Vector加鎖。
// 快速失敗示例
Vector<String> vector = new Vector<>(Arrays.asList("A", "B", "C"));
for (String s : vector) {
if (s.equals("B")) {
vector.remove(s); // 拋出 ConcurrentModificationException
}
}2. 內(nèi)存開銷
- 擴容可能導(dǎo)致內(nèi)存浪費(如頻繁擴容時)。
- 建議根據(jù)業(yè)務(wù)需求合理設(shè)置初始容量和容量增量。
八、Vector的應(yīng)用場景
1. 推薦使用場景
- 小規(guī)模多線程環(huán)境(如連接池、緩存)。
- 需要簡單線程安全的集合,且性能要求不高。
2. 替代方案
- 高并發(fā)場景:使用
CopyOnWriteArrayList(寫時復(fù)制,讀性能高)。 - 單線程場景:使用
ArrayList(性能更高)。 - 需要手動同步:使用
Collections.synchronizedList(new ArrayList<>())。
九、Vector示例代碼
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
// 創(chuàng)建Vector
Vector<String> vector = new Vector<>(5, 2); // 初始容量5,增量2
// 添加元素
vector.add("Apple");
vector.add("Banana");
vector.insertElementAt("Cherry", 1);
// 遍歷Vector
System.out.println("Vector元素: " + vector);
for (String fruit : vector) {
System.out.println(fruit);
}
// 修改元素
vector.set(1, "Blueberry");
// 刪除元素
vector.remove("Apple");
// 輸出結(jié)果
System.out.println("修改后的Vector: " + vector);
}
}十、總結(jié)
Vector 是 Java 早期提供的線程安全動態(tài)數(shù)組,盡管其同步機制簡化了多線程開發(fā),但性能開銷較大?,F(xiàn)代 Java 開發(fā)中,推薦使用更高效的線程安全集合類(如CopyOnWriteArrayList)或非線程安全的 ArrayList 并手動同步。理解 Vector 的特性、擴容策略和適用場景,有助于在特定需求下合理選擇數(shù)據(jù)結(jié)構(gòu)。
到此這篇關(guān)于【Java第85集】java Vector類詳解的文章就介紹到這了,更多相關(guān)java Vector類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java中使用externds關(guān)鍵字繼承類的用法
子類使用extends繼承父類是Java面向?qū)ο缶幊讨械幕A(chǔ)知識,這里我們就來詳解Java中使用externds關(guān)鍵字繼承類的用法,需要的朋友可以參考下2016-07-07
java并發(fā)編程JUC CountDownLatch線程同步
這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容2021-09-09
SpringBoot使用swagger生成api接口文檔的方法詳解
在之前的文章中,使用mybatis-plus生成了對應(yīng)的包,在此基礎(chǔ)上,我們針對項目的api接口,添加swagger配置和注解,生成swagger接口文檔,需要的可以了解一下2022-10-10
java中的構(gòu)造函數(shù)什么時候被調(diào)用執(zhí)行
這篇文章主要介紹了java中的構(gòu)造函數(shù)什么時候被調(diào)用執(zhí)行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

