Java中的向量与数组列表
ArrayList 和 Vectors 都实现了 List 接口,并且都使用(动态调整大小的)数组作为其内部数据结构,就像使用普通数组一样。
句法:
ArrayList: ArrayList al = new ArrayList();
Vector: Vector v = new Vector();
Java中的 Vector 与 ArrayList
S. No. | ArrayList | Vector |
---|---|---|
1. | ArrayList is not synchronized. | Vector is synchronized. |
2. | ArrayList increments 50% of the current array size if the number of elements exceeds ts capacity. | Vector increments 100% means doubles the array size if the total number of elements exceeds its capacity. |
3. | ArrayList is not a legacy class. It is introduced in JDK 1.2. | Vector is a legacy class. |
4. | ArrayList is fast because it is non-synchronized. | Vector is slow because it is synchronized, i.e., in a multithreading environment, it holds the other threads in a runnable or non-runnable state until the current thread releases the lock of the object. |
5. | ArrayList uses the Iterator interface to traverse the elements. | A Vector can use the Iterator interface or Enumeration interface to traverse the elements. |
ArrayList 和 Vector 的显着区别:
- 同步: Vector 是同步的,即一次只能有一个线程访问代码,而 ArrayList 是非同步的,即多个线程可以同时在 ArrayList 上工作。例如,如果一个线程正在执行添加操作,那么在多线程环境中可能有另一个线程执行删除操作。如果多个线程同时访问 ArrayList,那么我们必须同步修改列表结构的代码块或允许简单的元素修改。结构修改是指从列表中添加或删除元素。设置现有元素的值不是结构修改。
- 性能: ArrayList 更快。由于它是非同步的,而向量操作由于它们是同步的(线程安全的)而提供较慢的性能,如果一个线程在一个向量上工作,它已经获得了一个锁,这迫使任何其他想要在它上工作的线程必须等到锁被释放。
- 数据增长: ArrayList 和 Vector都动态增长和收缩以保持对存储的最佳使用——但它们调整大小的方式不同。如果元素数量超过其容量,ArrayList 会增加当前数组大小的 50%,而 vector 会增加 100%——实际上是当前数组大小的两倍。
- 遍历: Vector 可以同时使用Enumeration 和 Iterator来遍历向量元素,而 ArrayList 只能使用Iterator进行遍历。
- 应用程序:大多数时候,程序员更喜欢 ArrayList 而不是 Vector,因为 ArrayList 可以使用 Collections.synchronizedList 显式同步。
Note: ArrayList is preferable when there is no specific requirement to use vector.
Java
// 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 al = new ArrayList();
// adding object to arraylist
al.add("Practice.GeeksforGeeks.org");
al.add("quiz.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 v = new Vector();
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
quiz.GeeksforGeeks.org
code.GeeksforGeeks.org
contribute.GeeksforGeeks.org
Vector elements are:
Practice
quiz
code
如何在 ArrayList 和 Vector 之间进行选择?
- ArrayList 是不同步的并且不是线程安全的,而 Vectors 是。只有一个线程可以调用 Vector 上的方法,这有点开销,但在考虑安全性时很有帮助。因此,在单线程情况下,ArrayList 是显而易见的选择,但在涉及多线程时,向量通常更可取。
- 如果我们不知道我们将拥有多少数据但知道它的增长速度,Vector 有一个优势,因为我们可以在向量中设置增量值。
- ArrayList 更新更快。如果我们对使用它们中的任何一个都没有任何明确要求,我们使用 ArrayList 而不是向量。