Vector 與 ArrayList 一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫 Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問 ArrayList 慢。
~
本篇內容包括:Vector 概述、Vector 的使用(構造方法&常用方法)、ArrayList 與 Vector 的區別以及 Stack 棧的相關知識點!
文章目錄
- 一、Vector 概述
- 二、Vector 的使用
- 1、構造函數
- 2、常用方法
- 三、其他知識點
- 1、ArrayList 與 Vector 的區別
- 2、關于 Stack 棧
一、Vector 概述
Vector 與 ArrayList 一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫 Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問 ArrayList慢。
Vector 的思路和 ArrayList 基本是相同的,底層是數組保存元素,Vector 默認的容量是10,有一個增量系數,如果指定,那么每次都會增加一個系數的大小,否則就擴大一倍。
Vector 擴容的時候,其實就是數組的復制,其實還是比較耗時間的,所以,我們使用的時候應該盡量避免比較消耗時間的擴容操作。
Vector 和 ArrayList 最大的不同,是它是線程安全的,幾乎每一個方法都加上了 Synchronize 關鍵字,所以它的效率相對也比較低一點。ArrayList 如果需要線程安全,可以使用 Collections.synchronizedList(new ArrayList(...));
方法,獲取一個線程安全的 List。
二、Vector 的使用
1、構造函數
方法名 | 方法說明 |
---|---|
public Vector() | 此構造函數用于創建空向量,以使其內部數據數組的大小為10,其標準容量增量為零 |
public Vector(int initialCapacity) | 此構造函數用于創建具有指定初始容量且容量增量等于零的空向量 |
public Vector(int initialCapacity, int capacityIncrement) | 此構造函數用于創建具有指定初始容量和容量增量的空向量 |
public Vector(Collection<? extends E> c) | 此構造函數用于按照集合的迭代器返回的順序創建包含指定集合元素的向量 |
2、常用方法
方法名 | 方法說明 |
---|---|
boolean add(E o) | 此方法將指定的元素追加到此Vector的末尾 |
void add(int index, E element) | 此方法將指定的元素插入此Vector中的指定位置 |
boolean addAll(Collection<? extends E> c) | 此方法將指定Collection中的所有元素追加到此Vector的末尾 |
boolean addAll(int index, Collection<? extends E> c) | 此方法將指定Collection中的所有元素插入到此Vector中的指定位置 |
void addElement(E obj) | 此方法將指定的組件添加到此向量的末尾,將其大小增加1 |
int capacity() | 此方法返回此向量的當前容量 |
void clear() | 此方法從此向量中刪除所有元素 |
Object clone() | 此方法返回此向量的克隆 |
boolean contains(Object elem) | 如果此向量包含指定的元素,則此方法返回true |
boolean containsAll(Collection<?> c) | 如果此Vector包含指定Collection中的所有元素,則此方法返回true |
void copyInto(Object[] anArray) | 此方法將此向量的組件復制到指定的數組中 |
E elementAt(int index) | 此方法返回指定索引處的組件 |
Enumeration<E> elements() | 此方法返回此向量的組件的枚舉。 |
void ensureCapacity(int minCapacity) | 此方法可增加此向量的容量,以確保它至少可以保存最小容量參數指定的組件數 |
boolean equals(Object o) | 此方法將指定的Object與此Vector進行比較以獲得相等性 |
E firstElement() | 返回此向量的第一個組件(位于索引 0 處的項) |
E get(int index) | 返回向量中指定位置的元素 |
int indexOf(Object elem) | 搜索給定參數的第一個匹配項,使用 equals 方法測試相等性 |
int indexOf(Object elem, int index) | 搜索給定參數的第一個匹配項,從 index 處開始搜索,并使用 equals 方法測試其相等性 |
void insertElementAt(E obj, int index) | 將指定對象作為此向量中的組件插入到指定的 index 處 |
boolean isEmpty() | 測試此向量是否不包含組件 |
E lastElement() | 返回此向量的最后一個組件 |
int lastIndexOf(Object elem) | 返回指定的對象在此向量中最后一個匹配項的索引 |
int lastIndexOf(Object elem, int index) | 向后搜索指定的對象,從指定的索引處開始搜索,并返回一個索引 |
E remove(int index) | 移除此向量中指定位置的元素 |
boolean remove(Object o) | 移除此向量中指定元素的第一個匹配項,如果向量不包含該元素,則元素保持不變 |
boolean removeAll(Collection<?> c) | 從此向量中移除包含在指定 Collection 中的所有元素 |
void removeAllElements() | 從此向量中移除全部組件,并將其大小設置為零 |
boolean removeElement(Object obj) | 從此向量中移除變量的第一個(索引最小的)匹配項 |
void removeElementAt(int index) | 刪除指定索引處的組件 |
protected void removeRange(int fromIndex, int toIndex) | 從此 List 中移除其索引位于 fromIndex(包括)與 toIndex(不包括)之間的所有元素 |
boolean retainAll(Collection<?> c) | 在此向量中僅保留包含在指定 Collection 中的元素 |
E set(int index, E element) | 用指定的元素替換此向量中指定位置處的元素 |
void setElementAt(E obj, int index) | 將此向量指定 index 處的組件設置為指定的對象 |
void setSize(int newSize) | 設置此向量的大小 |
int size() | 返回此向量中的組件數 |
List<E> subList(int fromIndex, int toIndex) | 返回此 List 的部分視圖,元素范圍為從 fromIndex(包括)到 toIndex(不包括) |
Object[] toArray() | 返回一個數組,包含此向量中以正確順序存放的所有元素 |
<T> T[] toArray(T[] a) | 返回一個數組,包含此向量中以正確順序存放的所有元素;返回數組的運行時類型為指定數組的類型 |
String toString() | 返回此向量的字符串表示形式,其中包含每個元素的 String 表示形式 |
void trimToSize() | 對此向量的容量進行微調,使其等于向量的當前大小 |
三、其他知識點
1、ArrayList 與 Vector 的區別
Vector 和 ArrayList 一樣,都繼承自 List,在大多方法的實現上,Vector 較 ArrayList,就是多了一個 synchronized關鍵字
- Vector 是線程安全的,ArrayList 不是線程安全的
- ArrayList 在底層數組不夠用時在原來的基礎上擴展0.5倍,Vector 是擴展1倍
無一例外,只要是關鍵性的操作,Vector 的方法前面都加了 synchronized 關鍵字,來保證線程的安全性。當執行 synchronized 修飾的方法前,系統會對該方法加一把鎖,方法執行完成后釋放鎖,加鎖和釋放鎖的這個過程,在系統中是有開銷的,因此,在單線程的環境中,Vector效率要差很多。(多線程環境不允許用 ArrayList,需要做處理)。
和 ArrayList&Vector 一樣,同樣的類似關系的類還有 HashMap&HashTable,StringBuilder&StringBuffer,后者都是前者線程安全版本的實現實現。
2、關于 Stack 棧
棧(Stack) 是一種 后進先出(LIFO:Last In First Out) 的數據結構。
在 Java 中 Stack 類 extends Vector 棧容器,擴充了五個方法: push()
、peek()
、pop()
、empty()
、search()
,棧中的方法遵循后進先出 main 方法需要等所有方法執行完彈出后才會彈出,方法的遞歸每一層都要等下一層結束/彈出才能結束/彈出。
此外,由于 Stack 是繼承自 Vector 的,而 Vector 是線程安全的,所以 Stack 也是線程安全的。然而正因為 Stack 繼承自 Vector,Stack 類已經不被官方推薦使用!!
官方推薦使用 LinkedList 來構建棧!!