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 上取得。