Java 中的 Vector 与 ArrayList

ArrayList 和 Vector 是软件包中最常用的两个类 collection 的 java 和 Vector 和 ArrayList 之间的区别是一个非常常见的问题。虽然这是一个简单的问题,但重要的是要知道何时使用 Vector 或 ArrayList,尤其是在处理大型项目时。

在本文中,我们将了解 Java 中 Vector 和 ArrayList 之间的差异点,并尝试理解这些差异背后的概念。

在我们讨论 Vector 和 Vector 之间的区别之前和 ArrayList,让我们看看这两者之间的相似之处:
  1. Vector 和 ArrayList 使用可扩展的存储结构。
  2. ArrayList 和 Vector 使用内部数组结构。
  3. 这两个列表都保持元素的插入顺序。这意味着,如果浏览 ArrayList 或 Vector,则可以按照对象插入的顺序检索对象。
  4. Vector 和 ArrayList 允许重复元素,并且 null 值。
  5. Iterator 和 listIterator 由 Vector 和 ArrayList 返回的类型为 fail-fast。

Vector 与 ArrayList

1) Synchronization
ArrayList 不同步,这意味着多个线程可以同时访问它。例如,如果一个线程正在 ArrayList 中执行追加操作,则另一个线程可能正在不同步的多线程环境中执行并行删除操作。

Vector 已同步。这可确保在并发和多线程环境中安全地使用线程。例如,如果线程正在 Vector 中执行操作,则在第一个线程完成之前,其他线程无法访问它。与 ArrayList 不同,一次只能有一个线程执行操作。

2) Performance
ArrayList 性能更高、速度更快,因为它是非同步的,因此在单线程环境中是一个非常好的选择。如果线程只读取 ArrayList.

由于 Vector 是同步的,因此它为同步付出了代价,这使得它变慢且性能不佳。执行操作的线程会阻止对其他线程的访问,因此,它们会等到解锁锁。

3) 调整大小
两个列表的存储容量是可扩展的或可收缩的, Java 设计人员已将其动态化,以保持最佳存储使用率。但是,每个都有自己的方法。ArrayList 的大小增加了一半,而 Vector 的默认大小增加了一倍。可以通过调用方法 ensureCapacity().

4) fail-fast
首先,让我们了解什么是fail-fast:如果集合(ArrayList、Vector 等)被修改,除了迭代器添加和删除操作之外,在创建迭代器后,迭代器将引发异常ConcurrentModificationException。更改结构与在集合中添加或删除项有关。

Vector 通过调用 elements()那不是失败。另一方面,ArrayList 返回的 Iterator 和 ListIterator 是 fail-fast.

5) 谁真正属于集合框架?
Vector 是 JDK 1.0 附带的类之一,最初不是集合框架的一部分,但在最新版本中,它已被考虑在内,因为它实现了 List 接口,因此, 它成为 collection.

ArrayList 框架是在 Vector 发布 JDK 1.2 之后引入的。ArrayList 比 Vector 更先进,但它也具有 Vector 的所有规格。因此,人们开始使用 ArrayList 而不是 Vector,在这种情况下,Vector 成为了一个遗留类。

何时使用 Vector 和 ArrayList?

这取决于您的需求,如果您的代码执行进程(线程)的同步,Vector 将是最佳选择,因为它确保一次只有一个线程访问集合。

与非同步操作相比,同步操作会消耗大量时间,因此,如果您的应用程序需要运行得更快并且不需要同步,那么 ArrayList 将是正确的选择,从性能上讲。

此表总结了我们看到的 5 个差异:

ArrayList Vector
1) ArrayList 未同步。 Vector is synchronized
2) 如果元素数超过其容量,ArrayList 将增加其当前大小的 50% Vector invrementes 100%,这意味着如果元素数超过其容量,则其原始大小将增加一倍
3) JDK 1.2. Vector 是在 JDK 1.0 中引入的
4) ArrayList 速度很快,因为它不是同步的 Vector 很慢,因为它是同步的。在竞争环境中,它将阻止其他进程访问,直到第一个线程允许访问
5) ArrayList 使用 Iterator 遍历 elements Vector 使用 Enumeration 接口遍历元素,但是, 它也可以使用迭代器