Java Vector与ArrayList
ArrayList和Vectors都实现了List接口,并且都使用 (可动态调整大小的)数组 作为其内部数据结构,就像使用普通数组一样。
语法
ArrayList:ArrayList<T> al = new ArrayList<T>();
Vector:Vector<T> v = new Vector<T>();
ArrayList与Vector
| S. No. | ArrayList | Vector |
|---|---|---|
| 1 | 数组表是不同步的。 | 向量是同步的。 |
| 2 | ArrayList在元素数量超过其容量时,会增加当前数组大小的50%。 | 如果元素的总数超过了它的容量,Vector会增加100%,也就是加倍数组的大小。 |
| 3 | ArrayList不是一个传统的类。它是在JDK 1.2中引入的。 | Vector是一个传统的类。 |
| 4 | ArrayList是快速的,因为它是非同步的。 | Vector很慢,因为它是同步的,也就是说,在多线程环境中,它使其他线程处于可运行或不可运行的状态,直到当前线程释放对象的锁。 |
| 5 | ArrayList使用Iterator接口来遍历元素。 | Vector可以使用Iterator接口或Enumeration接口来遍历元素。 |
| 6 | ArrayList的性能很高 | Vector的性能很低 |
| 7 | 允许多线程 | 只允许一个线程。 |
ArrayList和Vector之间的显著区别
- 同步: Vector是 同步的 ,这意味着每次只有一个线程可以访问代码,而ArrayList是 不同步的 ,这意味着多个线程可以同时在ArrayList上工作。例如,如果一个线程正在执行添加操作,那么在多线程环境下,可能有另一个线程在执行删除操作。如果多个线程同时访问ArrayList,那么我们必须同步对列表进行结构性修改的代码块,或者允许进行简单的元素修改。结构性修改是指从列表中增加或删除元素。设置现有元素的值不属于结构性修改。

- 性能: ArrayList更快。因为它是非同步的,而Vector操作的性能较慢,因为它们是同步的(线程安全的),如果一个线程在一个Vector上工作,它已经获得了一个锁,这迫使任何其他线程想要在它上面工作,必须等待锁被释放。
- 数据增长: ArrayList和Vector 都是动态地增长和收缩 ,以保持对存储的最佳使用–但它们调整大小的方式是不同的。如果元素的数量超过了它的容量,ArrayList会增加当前数组大小的50%,而Vector会增加100%–基本上是将当前数组大小增加一倍。
- 遍历: Vector可以同时使用 Enumeration和Iterator 来遍历向量元素,而ArrayList只能使用 Iterator 来遍历。
- 应用: 大多数时候,程序员更喜欢ArrayList而不是Vector,因为ArrayList可以明确地使用Collections.synchronizedList进行同步。
如何获得arraylist对象的同步版本
默认情况下,arraylist对象是不同步的,但是我们可以通过使用集合类的Synchronized List()方法来获得arraylist的同步版本。
/*package whatever //do not write package name here */
import java.io.*;
class GFG {
public static void main (String[] args) {
public static List SynchronizedList(list1)
// non synchronized
ArrayList l1 = new ArrayList();
// Synchronized
List l= Collections.SynchronizedList(l1);
}
}
注意: 当没有特别要求使用向量时,ArrayList是比较好的。
// Java Program to illustrate use
// of ArrayList and Vector in Java
import java.io.*;
import java.util.*;
class GFG
{
public static void main (String[] args)
{
// creating an ArrayList
ArrayList<String> al = new ArrayList<String>();
// adding object to arraylist
al.add("Practice.GeeksforGeeks.org");
al.add("www.GeeksforGeeks.org");
al.add("code.GeeksforGeeks.org");
al.add("contribute.GeeksforGeeks.org");
// 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("Practice");
v.addElement("quiz");
v.addElement("code");
// traversing elements using Enumeration
System.out.println("\nVector elements are:");
Enumeration e = v.elements();
while (e.hasMoreElements())
System.out.println(e.nextElement());
}
}
输出
ArrayList elements are:
Practice.GeeksforGeeks.org
www.GeeksforGeeks.org
code.GeeksforGeeks.org
contribute.GeeksforGeeks.org
Vector elements are:
Practice
quiz
code
如何在ArrayList和Vector之间做出选择
- ArrayList是不同步的,不是线程安全的,而Vectors是。只有一个线程可以调用Vector上的方法,这略微有些开销,但在安全问题上是有帮助的。因此,在单线程的情况下,ArrayList是明显的选择,但在涉及多线程的情况下,向量往往是最好的。
- 如果我们不知道我们将有多少数据,但知道它的增长速度,向量有优势,因为我们可以在向量中设置增量值。
- ArrayList比较新,速度也比较快。如果我们对使用它们中的任何一个没有明确的要求,我们就使用ArrayList而不是向量。
极客教程