Java中的Vector与ArrayList
ArrayList和Vector都实现了List接口,两者都使用 (动态可调整大小的)数组 作为其内部数据结构,就像使用普通数组一样。
语法:
ArrayList: ArrayList
Vector: Vector
ArrayList与Vector的比较
编号 | ArrayList | Vector |
---|---|---|
1. | ArrayList未同步。 | Vector已同步。 |
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操作由于是同步的(线程安全),所以性能较慢,如果一个线程在向量上工作,它已经获得了对它的锁定,这将强制其他想要在它上工作的线程等待,直到锁定被释放。
- 数据增长: ArrayList和Vector都动态增加和缩小以实现存储的最佳利用 — 但它们调整大小的方式是不同的。如果元素数量超过其容量,ArrayList会将其当前数组大小增加50%,而vector会增加100% — 从本质上说是将当前数组大小加倍。
- 遍历: Vector可以使用Enumeration和Iterator遍历向量元素,而ArrayList只能使用Iterator遍历。
- 应用程序: 大多数时候,程序员更喜欢ArrayList而不是Vector,因为可以使用Collections.synchronizedList显式地对ArrayList进行同步处理。
如何获得同步的arraylist对象:
默认情况下,arraylist对象是非同步的,但是我们可以使用collection类中的Synchronized List()方法获得synchronized版本的arraylist。
/*不要在这里写包名称*/
import java.io.*;
class GFG {
public static void main (String[] args) {
public static List SynchronizedList(list1)
//非同步
ArrayList l1 = new ArrayList();
//同步
List l= Collections.SynchronizedList(l1);
}
}
注意: ArrayList是首选的,当没有特定要求使用vector时。
// Java程序演示在Java中使用ArrayList和Vector的用法
import java.io.*;
import java.util.*;
class GFG
{
public static void main (String[] args)
{
// 创建ArrayList
ArrayList<String> al = new ArrayList<String>();
//添加对象到ArrayList
al.add("Practice.GeeksforGeeks.org");
al.add("www.GeeksforGeeks.org");
al.add("code.GeeksforGeeks.org");
al.add("contribute.GeeksforGeeks.org");
//使用Iterator遍历元素
System.out.println("ArrayList elements are:");
Iterator it = al.iterator();
while (it.hasNext())
System.out.println(it.next());
// 创建Vector
Vector<String> v = new Vector<String>();
v.addElement("Practice");
v.addElement("quiz");
v.addElement("code");
//使用枚举遍历元素
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不是同步的并且不安全,而Vector是安全的。只有一个线程可以在Vector上调用方法,这在具有安全性时略有开销,因此在单线程的情况下,ArrayList是显而易见的选择,但在多线程情况下,通常会选择使用Vectors。
- 如果我们不知道将有多少数据,但知道它增长的速率,则Vector具有优势,因为我们可以设置Vetor的增量值。
- ArrayList是更新更快的。如果我们没有任何明确的使用要求,我们应该使用ArrayList而不是Vector。