Java Vector与ArrayList

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,那么我们必须同步对列表进行结构性修改的代码块,或者允许进行简单的元素修改。结构性修改是指从列表中增加或删除元素。设置现有元素的值不属于结构性修改。

Java中的向量与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而不是向量。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程