Java 中的容器物件,例如 Vector 和 ArrayList 是什麼?
Vector 和 ArrayList 都實現了 List 介面,並且它們都使用(動態可調整大小的)陣列作為其內部資料結構,類似於使用普通陣列。
但是,ArrayList 和 Vector 類之間存在許多差異,因此透過閱讀本文,您將瞭解 ArrayList 和 Vector 類是什麼以及它們的主要區別,這將幫助您選擇哪一個。
瞭解 ArrayList 和 Vector 類
除了 Arrays 類之外,Java 還提供了一個 ArrayList 類,可用於建立儲存物件列表的容器。
ArrayList 被認為是可增長的陣列,它為您提供快速迭代和快速隨機訪問。
ArrayList 的語法如下 −
ArrayList: ArrayList<T> al = new ArrayList<T>();
示例
這是一個說明 ArrayList 如何儲存和遍歷元素的示例
import java.util.*; public class TestArrayList21{ public static void main(String args[]){ List<String> al=new ArrayList<String>(); //creating arraylist al.add("Mike"); //adding object in arraylist al.add("Jack"); al.add("Rose"); al.add("James"); //traversing elements using Iterator Iterator itr=al.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }
執行上述程式時,將得到以下結果。
輸出
Mike Jack Rose James
另一方面,早期版本的 Java 具有一個名為 Vector 的遺留集合類,它與 ArrayList 非常相似,並實現了動態陣列。
ArrayList 的語法如下 −
Vector: Vector<T> v = new Vector<T>();
示例
這是一個說明使用 Enumeration 介面的 Java Vector 類的示例
import java.util.*; public class TestVector1{ public static void main(String args[]){ Vector<String> v=new Vector<String>(); //creating vector v.add("Stephanie"); //method of Collection v.addElement("Amith"); //method of Vector v.addElement("Andros"); //traversing elements using Enumeration Enumeration e=v.elements(); while(e.hasMoreElements()){ System.out.println(e.nextElement()); } } }
執行上述程式時,將得到以下結果。
輸出
Stephanie Amith Andros
ArrayList 和 Vector 之間的區別
基於以下因素,ArrayList 和 Vector 類之間存在某些差異,如下所示。
同步
Vector 是同步的,因此一次只有一個執行緒可以訪問程式碼,而 ArrayList 不是同步的,因此多個執行緒可以同時處理 ArrayList。
例如,在多執行緒環境中,如果一個執行緒正在執行新增操作,則另一個執行緒可能正在執行刪除操作。如果多個執行緒同時訪問 ArrayList,則需要同步修改列表結構的程式碼塊或允許簡單的元素修改。結構修改是從列表中新增或刪除元素。更改現有元素的值不是結構修改。
效能
由於 ArrayList 是非同步的,因此它更快,而 Vector 操作的效能較慢,因為它們是同步的(執行緒安全的),因此當一個執行緒處理 Vector 時,它會獲取一個鎖,這會強制其他執行緒等待直到鎖釋放後才能處理它。
資料增長
為了保持儲存的最佳利用,ArrayList 和 Vector 都可以動態增長和收縮 - 但它們調整大小的方式完全不同。
通常,如果元素總數超過其容量,ArrayList 會將當前陣列大小增加 50%,而 Vector 會增加 100% - 本質上是將當前陣列大小加倍,如果元素總數超過其容量。
遍歷
為了遍歷 Vector 元素,通常,Vector 使用 Enumeration 和 Iterator,而 ArrayList 僅使用 Iterator。
應用
大多數程式設計師更喜歡 ArrayList 而不是 Vector,因為 ArrayList 可以使用 Collections 顯式同步。
注意− 當沒有具體要求使用 Vector 時,開發人員最常首選 ArrayList。
示例
這是一個說明在 Java 中使用 ArrayList 和 Vector 的 Java 程式 −
import java.io.*; import java.util.*; public class Test{ public static void main (String[] args){ // creating an ArrayList ArrayList<String> al = new ArrayList<String>(); // adding object to arraylist al.add("Learn.tutorialspoint.com"); al.add("Coding.tutorialspoint.com"); al.add("Practice.tutorialspoint.com"); al.add("Test.tutorialspoint.com"); // traversing elements using Iterator' System.out.println("ArrayList elements are:"); Iterator it = al.iterator(); while (it.hasNext()) System.out.println(it.next()); // creating Vector Vector<String> v = new Vector<String>(); v.addElement("Learn"); v.addElement("Practice"); v.addElement("Coding"); // traversing elements using Enumeration System.out.println("
Vector elements are:"); Enumeration e = v.elements(); while (e.hasMoreElements()) System.out.println(e.nextElement()); } }
執行上述程式時,將生成以下輸出
輸出
ArrayList elements are: Learn.tutorialspoint.com Coding.tutorialspoint.com Practice.tutorialspoint.com Test.tutorialspoint.com Vector elements are: Learn Practice Coding
總結
透過以上討論,我們希望您更好地理解了像 ArrayList 和 Vector 這樣的 Java 容器物件。以下是我們上面討論內容的總結。
ArrayList 是不同步的,也不是執行緒安全的,而 Vector 是同步的。
Vector 只能由一個執行緒呼叫,這會產生一些開銷,但在安全性至關重要時很有幫助。因此,在單執行緒情況下,ArrayList 最為可取,而在多執行緒情況下,Vector 是最明顯的選擇。
如果我們不確定將有多少資料,但知道其增長速度,則 Vector 具有優勢,因為我們可以在 Vector 中設定增量值。Vector 增量為 100%,這意味著如果元素總數超過其容量,則陣列大小加倍。
ArrayList 較新且速度更快。因此,如果您對使用兩者中的任何一個沒有明確的要求,則可以使用 ArrayList 而不是 Vector。
我們希望本文對您有所幫助。如果您喜歡本文,請與您的同事分享,如果您有任何其他疑問,請在下方評論。