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