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。

我们希望本文对您有所帮助。如果您喜欢本文,请与您的同事分享,如果您有任何其他疑问,请在下方评论。

更新于:2022年10月13日

617 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告