Java 中的 Vector 類別簡介
一、簡介
Vector類別是可增長物件數組的執行緒安全實作。它實作了java.util.List接口,並且是Java Collections Framework的成員。雖然它與ArrayList類似,但這些類別在實作上有顯著差異。
在本教程中,我們將探討Vector類別及其一些最常見的操作和方法。
2. Vector如何運作?
Vector類別被設計為動態數組,可以根據應用程式的需要擴展或縮小。因此,我們可以使用索引來存取Vector的物件。此外,它還維護插入順序並儲存重複元素。
每個Vector目標是透過追蹤容量和capacityIncrement來增強其儲存處理能力。容量只不過是Vector的大小。當我們在其中添加元素時, Vector的大小會增加。因此,容量始終等於或大於Vector的大小。
每次Vector的長度達到其容量時,都會計算新的長度:
newLength = capacityIncrement == 0 ? currentSize * 2 : currentSize + capacityIncrement
與ArrayList類似, Vector類別的迭代器也是快速失敗的。如果我們在迭代Vector時嘗試修改它,它會拋出ConcurrentModificationException 。但是,我們可以存取迭代器的add()或remove()方法來結構性地修改Vector 。
3. 如何使用Vector
讓我們看看如何建立一個Vector並對其執行各種操作。
3.1.建立Vector
我們可以使用建構子來建立Vector實例。有四種不同類型的Vector建構函式。
第一個是預設建構函數,它建立一個空Vector ,初始容量為10 ,標準capacityIncrement為0 :
Vector<T> vector = new Vector<T>();
我們可以透過指定其初始大小(容量)來建立一個空Vector 。在這種情況下,它的capacityIncrement也設定為0 :
Vector<T> vector = new Vector<T>(int size);
還有另一個建構函數,我們可以使用它來指定初始容量和capacityIncrement來建立一個空的Vector :
Vector<T> vector = new Vector<T>(int size, int capacityIncrement);
最後,我們可以透過將另一個Collection傳遞給建構函式來建構一個Vector 。產生的Vector包含指定Collection的所有元素:
Vector<T> vector = new Vector(Collection<T> collection);
3.2.在Vector中加入元素
讓我們建立一個傳回Vector方法。我們將在以後的操作中使用此方法:
Vector<String> getVector() {
Vector<String> vector = new Vector<String>();
vector.add("Today");
vector.add("is");
vector.add("a");
vector.add("great");
vector.add("day!");
return vector;
}
在這裡,我們使用預設建構子建立了一個空的String Vector並添加了一些String 。
根據需要,我們可以在Vector的末尾添加元素或特定索引。為此,我們可以使用重載的add()方法來滿足各種需求。
現在,讓我們將特定索引處的元素加入vector :
vector.add(2, "not"); // add "not" at index 2
assertEquals("not", vector.get(2)); // vector = [Today, is, not, a, great, day!]
這裡,我們使用Vector類別的add(int index, E element)方法在索引2處加入String 「 not 」。我們應該注意到,它將指定索引之後的所有元素向右移動一位。因此, String “ not ”被加到String “ is ”和“ a ”之間。
類似地,我們可以使用方法addAll(Collection c)將Collection的所有元素加入Vector中。使用此方法,我們可以按照與Collection相同的順序將集合的所有元素附加到Vector的末尾:
ArrayList<String> words = new ArrayList<>(Arrays.asList("Baeldung", "is", "cool!"));
vector.addAll(words);
assertEquals(9, vector.size());
assertEquals("cool!", vector.get(8));
執行上述程式碼後,如果我們列印vector ,我們將得到以下結果:
[Today, is, not, a, great, day!, Baeldung, is, cool!]
3.3.更新元素
我們可以使用set()方法來更新Vector的元素。 set()方法以新元素取代指定索引處的元素,同時傳回已取代的元素。因此,它接受兩個參數——要替換的元素的索引和新元素:
Vector<String> vector = getVector();
assertEquals(5, vector.size());
vector.set(3, "good");
assertEquals("good", vector.get(3));
3.4.刪除元素
我們可以使用remove()方法從Vector中刪除一個元素。根據各種需要,它已超載。因此,我們可以刪除特定元素或特定索引處的元素,或Vector的所有元素。讓我們來看幾個例子。
如果我們將一個物件傳遞給remove()方法,則第一次出現的物件將被刪除:
Vector<String> vector = getVector();
assertEquals(5, vector.size());
vector.remove("a");
assertEquals(4, vector.size()); // vector = [Today, is, great, day!]
類似地,如果我們現在將2傳遞給上面的remove()方法,它將刪除索引2處的元素great :
vector.remove(2);
assertEquals("day!", vector.get(2));
我們應該注意到,被刪除元素右側的所有元素都向左移動了一位。此外,如果我們提供的索引超出了Vector,即index < 0或index >= size() remove()方法會拋出ArrayIndexOutOfBoundsException 。
最後,讓我們刪除vector的所有元素:
vector.removeAll();
assertEquals(0, vector.size());
3.5.取得一個元素
我們可以使用get()方法來取得Vector中特定索引處的元素:
Vector<String> vector = getVector();
String fourthElement = vector.get(3);
assertEquals("great", fourthElement);
如果我們提供超出Vector範圍的索引, get()方法也會拋出ArrayIndexOutOfBoundsException 。
3.6. Vector向量
我們可以透過多種方式迭代Vector 。然而,最常見的方法之一是for -each 循環:
Vector<String> vector = getVector();
for(String string : vector) {
System.out.println(string);
}
我們也可以使用forEach()方法來迭代Vector ,特別是當我們想要對每個元素執行特定操作時:
Vector<String> vector = getVector();
vector.forEach(System.out::println);
4. 何時使用Vector
Vector的第一個也是最明顯的用途是當我們需要可成長的物件集合時。如果我們不確定不斷增長的集合的大小,但我們知道添加或刪除元素的頻率,那麼我們可能更喜歡使用Vector 。遇到這種情況,我們可以根據情況設定capacityIncrement 。
但是,由於Vector是同步的,因此最好在多執行緒應用程式中使用它。在單線程應用程式的情況下, ArrayList工作速度比Vector快得多。此外,我們可以使用Collections.synchronizedList()明確同步ArrayList 。
5. 結論
在本文中,我們了解了 Java 中的Vector類別。我們也探討如何建立Vector實例以及如何使用不同的方法來新增、尋找或刪除元素。
與往常一樣,本文的源代碼可以在 GitHub 上取得。