Java?Vector類(lèi)應(yīng)用場(chǎng)景
Vector
是 Java 中的一個(gè)經(jīng)典集合類(lèi),位于 java.util
包中。它是一個(gè) 動(dòng)態(tài)數(shù)組,允許存儲(chǔ)任意類(lèi)型的對(duì)象,并支持動(dòng)態(tài)調(diào)整大小。與 ArrayList
類(lèi)似,但 Vector
的所有方法都是 線程安全的,適用于多線程環(huán)境。以下是 Vector
類(lèi)的詳細(xì)介紹:
一、Vector的核心特性
1. 動(dòng)態(tài)數(shù)組
Vector
內(nèi)部通過(guò)數(shù)組實(shí)現(xiàn),支持動(dòng)態(tài)擴(kuò)容和縮容。- 當(dāng)元素?cái)?shù)量超過(guò)當(dāng)前數(shù)組容量時(shí),會(huì)自動(dòng)擴(kuò)容(默認(rèn)擴(kuò)容為當(dāng)前容量的 2 倍)。
- 支持隨機(jī)訪問(wèn)(通過(guò)索引直接獲取元素),實(shí)現(xiàn)
RandomAccess
接口。
2. 線程安全
- 所有方法(如
add
、get
、remove
)都通過(guò)synchronized
關(guān)鍵字修飾,確保多線程環(huán)境下的線程安全。 - 同步鎖粒度:對(duì)整個(gè)
Vector
對(duì)象加鎖,可能導(dǎo)致性能開(kāi)銷(xiāo)較大。
3. 允許重復(fù)元素和null值
- 與
ArrayList
一樣,Vector
允許存儲(chǔ)重復(fù)元素和null
值。
4. 序列化支持
- 實(shí)現(xiàn)
Serializable
接口,支持對(duì)象序列化,可以通過(guò)流進(jìn)行讀寫(xiě)。
5. 實(shí)現(xiàn)的接口
List<E>
:提供列表的基本操作(增刪查改)。RandomAccess
:支持快速隨機(jī)訪問(wèn)。Cloneable
:支持克隆操作。Serializable
:支持序列化。
二、Vector的構(gòu)造函數(shù)
構(gòu)造函數(shù) | 描述 |
---|---|
Vector() | 創(chuàng)建一個(gè)空的 Vector ,初始容量為 10。 |
Vector(int initialCapacity) | 指定初始容量,無(wú)容量增量(capacityIncrement 為 0)。 |
Vector(int initialCapacity, int capacityIncrement) | 指定初始容量和容量增量。每次擴(kuò)容時(shí),容量增加 capacityIncrement 的值。若 capacityIncrement <= 0 ,則擴(kuò)容為當(dāng)前容量的 2 倍。 |
Vector(Collection<? extends E> c) | 使用指定集合初始化 Vector 。 |
示例代碼:
// 默認(rèn)構(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(); // 清空Vector
3. 獲取和修改元素
get(int index)
:獲取指定索引的元素。set(int index, E element)
:替換指定索引的元素。elementAt(int index)
:與get
功能相同(Vector 特有的方法)。setElementAt(E obj, int index)
:與set
功能相同。
String fruit = vector.get(0); // 獲取第一個(gè)元素 vector.set(1, "Blueberry"); // 替換第二個(gè)元素
4. 容量和大小
size()
:返回當(dāng)前元素?cái)?shù)量。capacity()
:返回當(dāng)前數(shù)組的容量。ensureCapacity(int minCapacity)
:確保容量至少為minCapacity
。trimToSize()
:將數(shù)組容量調(diào)整為當(dāng)前元素?cái)?shù)量。
System.out.println(vector.size()); // 輸出元素?cái)?shù)量 System.out.println(vector.capacity()); // 輸出當(dāng)前容量
四、Vector的線程安全機(jī)制
1. 同步方法
- 所有方法通過(guò)
synchronized
關(guān)鍵字修飾,確保同一時(shí)刻只有一個(gè)線程訪問(wèn)。 - 示例:
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
2. 優(yōu)點(diǎn)
- 簡(jiǎn)單易用,無(wú)需手動(dòng)同步。
- 多線程環(huán)境下無(wú)需額外加鎖。
3. 缺點(diǎn)
- 性能開(kāi)銷(xiāo):每次方法調(diào)用都需要獲取鎖,高并發(fā)下性能較低。
- 鎖粒度粗:整個(gè)
Vector
被加鎖,即使只操作單個(gè)元素,也會(huì)阻塞其他線程。
五、Vector的擴(kuò)容機(jī)制
1. 初始容量
- 默認(rèn)初始容量為 10(若未指定)。
- 可通過(guò)構(gòu)造函數(shù)自定義初始容量。
2. 擴(kuò)容策略
- 默認(rèn)擴(kuò)容:若
capacityIncrement <= 0
,容量翻倍(newCapacity = oldCapacity * 2
)。 - 指定擴(kuò)容增量:容量增加
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的對(duì)比
特性 | Vector | ArrayList |
---|---|---|
線程安全 | ? 是(方法級(jí)同步) | ? 否 |
性能 | 較低(同步鎖開(kāi)銷(xiāo)) | 高 |
擴(kuò)容策略 | 默認(rèn)擴(kuò)容為 2 倍 | 擴(kuò)容為 1.5 倍 |
適用場(chǎng)景 | 多線程環(huán)境 | 單線程或需手動(dòng)同步的場(chǎng)景 |
替代方案 | CopyOnWriteArrayList 、Collections.synchronizedList | — |
七、Vector的使用注意事項(xiàng)
1. 快速失敗的迭代器
- 使用
Iterator
遍歷時(shí),如果在迭代過(guò)程中修改Vector
(如add
、remove
),會(huì)拋出ConcurrentModificationException
。 - 解決方案:使用
Enumeration
或在遍歷時(shí)對(duì)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)存開(kāi)銷(xiāo)
- 擴(kuò)容可能導(dǎo)致內(nèi)存浪費(fèi)(如頻繁擴(kuò)容時(shí))。
- 建議根據(jù)業(yè)務(wù)需求合理設(shè)置初始容量和容量增量。
八、Vector的應(yīng)用場(chǎng)景
1. 推薦使用場(chǎng)景
- 小規(guī)模多線程環(huán)境(如連接池、緩存)。
- 需要簡(jiǎn)單線程安全的集合,且性能要求不高。
2. 替代方案
- 高并發(fā)場(chǎng)景:使用
CopyOnWriteArrayList
(寫(xiě)時(shí)復(fù)制,讀性能高)。 - 單線程場(chǎng)景:使用
ArrayList
(性能更高)。 - 需要手動(dòng)同步:使用
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 早期提供的線程安全動(dòng)態(tài)數(shù)組,盡管其同步機(jī)制簡(jiǎn)化了多線程開(kāi)發(fā),但性能開(kāi)銷(xiāo)較大?,F(xiàn)代 Java 開(kāi)發(fā)中,推薦使用更高效的線程安全集合類(lèi)(如CopyOnWriteArrayList
)或非線程安全的 ArrayList
并手動(dòng)同步。理解 Vector
的特性、擴(kuò)容策略和適用場(chǎng)景,有助于在特定需求下合理選擇數(shù)據(jù)結(jié)構(gòu)。
到此這篇關(guān)于【Java第85集】java Vector類(lèi)詳解的文章就介紹到這了,更多相關(guān)java Vector類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Java局部?jī)?nèi)部類(lèi)原理與用法實(shí)例分析
這篇文章主要介紹了Java局部?jī)?nèi)部類(lèi)原理與用法,結(jié)合實(shí)例形式分析了Java局部?jī)?nèi)部類(lèi)功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09Java框架解說(shuō)之BIO NIO AIO不同IO模型演進(jìn)之路
網(wǎng)上很多IO資料,對(duì)新手來(lái)說(shuō),越看越暈。根據(jù)自己的理解,總結(jié)對(duì)比了一下BIO、NIO、AIO,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10MyBatis項(xiàng)目的創(chuàng)建和增刪查改操作詳解
這篇文章主要介紹了MyBatis項(xiàng)目的創(chuàng)建和增刪查改操作,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11Java并發(fā)編程中的ConcurrentLinkedQueue詳解
這篇文章主要介紹了Java并發(fā)編程中的ConcurrentLinkedQueue詳解,GetThread線程不會(huì)因?yàn)镃oncurrentLinkedQueue隊(duì)列為空而等待,而是直接返回null,所以當(dāng)實(shí)現(xiàn)隊(duì)列不空時(shí),等待時(shí),則需要用戶自己實(shí)現(xiàn)等待邏輯,需要的朋友可以參考下2023-12-12mybatisPlus填坑之邏輯刪除的實(shí)現(xiàn)
本文主要介紹了mybatisPlus填坑之邏輯刪除的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Java注解之Retention、Documented、Inherited介紹
這篇文章主要介紹了Java注解之Retention、Documented、Inherited注解介紹,本文內(nèi)容和相關(guān)文章是系列文章,需要的朋友可以參考下2014-09-09Mybatis分頁(yè)插件PageHelper的配置和簡(jiǎn)單使用方法(推薦)
在使用Java Spring開(kāi)發(fā)的時(shí)候,Mybatis算是對(duì)數(shù)據(jù)庫(kù)操作的利器了。這篇文章主要介紹了Mybatis分頁(yè)插件PageHelper的配置和使用方法,需要的朋友可以參考下2017-12-12Java的Spring框架中DAO數(shù)據(jù)訪問(wèn)對(duì)象的使用示例
這篇文章主要介紹了Java的Spring框架中DAO數(shù)據(jù)訪問(wèn)對(duì)象的使用示例,分為在Spring中DOA與JDBC以及與Hibernate的配合使用兩種情況來(lái)進(jìn)行演示,需要的朋友可以參考下2016-03-03