Java中ArrayList和Vector的区别
ArrayList
和 Vector
是 java 集合包中两个最常用的类,Vector 和 ArrayList 之间的区别是面试中最常被问到的 java 面试问题之一。 虽然在我看来这是一个非常简单的问题,但是如果你正在做一个项目,知道什么时候使用 Vector 而不是 ArrayList 还是很重要的。 在本文中,我们将从 Java 中的 Vector 和 ArrayList 之间的一些基于点的差异开始,并试图理解这些差异背后的概念。
最终目标是让自己熟悉 ArrayList 和 Vector 的区别属性。 Java 5 还添加了另一个 List 接口的实现,它类似于 Vector 和 ArrayList,但提供比 Vector 更好的并发访问,称为 CopyOnWriteArrayList
。
顺便说一句,LinkedList和ArrayList的区别 以及 List vs Set 是其他基于Java中集合框架的热门面试问题。
在了解 Vector 和 ArrayList 之间的区别之前,让我们了解一下这两者之间的一些相似之处以及为什么在某些情况下我们可以使用 ArrayList 代替 Vector。
- Vector 和 ArrayList 是基于索引的,内部有一个数组做备份。
- ArrayList 和 Vector 都维护一个元素的插入顺序。 这意味着可以假设如果迭代 ArrayList 或 Vector,将按照插入的顺序获取对象。
- ArrayList 和 Vector 返回的 Iterator 和 ListIterator 都是 fail-fast 的。
- ArrayList 和 Vector 也允许 null 和重复。
Java 中的 Vector 与 ArrayList
现在让我们看看 Java 中 Vector 和 ArrayList 之间的一些主要区别,这将决定何时是使用 Vector 而不是 ArrayList 的正确时机,反之亦然。 差异基于诸如同步、线程安全、速度、性能、导航和列表迭代等属性。
1) 同步和线程安全
Vector 和 ArrayList 之间的首要区别是 Vector 是同步的而 ArrayList 不是,这意味着所有在结构上修改 Vector 的方法,例如 add()
或 remove()
是同步的,这使得它是线程安全的,并允许它在多线程和并发环境中安全地使用。
另一方面,ArrayList 方法不是同步的,因此不适合在多线程环境中使用。 这也是线程上的一道热门面试题,有人问为什么 ArrayList 不能在多线程间共享。
2) 速度和性能
ArrayList 比 Vector 快得多。 由于 Vector 是同步的并且是线程安全的,因此它付出了同步的代价,这使得它有点慢。 另一方面,ArrayList 不是同步的并且速度很快,这使得它成为单线程访问环境中的明显选择。 如果多个线程只从 ArrayList 读取值,我们也可以在多线程环境中使用 ArrayList,或者也可以创建只读 ArrayList。
3) 容量
每当 Vector 超过指定的阈值时,它都会将自身增加 capacityIncrement
字段中指定的值,同时我们可以通过调用 ensureCapacity()
方法来增加 ArrayList 的大小。
4) 枚举和迭代器
Vector 可以通过调用 elements()
方法返回项目的枚举,与 ArrayList 返回的 Iterator 和 ListIterator 不同,它不是快速失败的。关于 Enumeration 和 Iterator 的区别可以查看我们的这篇文章
5) 遗留
另一点值得记住的是 Vector 是 JDK 1.0 附带的类之一,最初不是 Collection 框架的一部分,但在后来的版本中,它被重构为实现 List 接口,因此它可以成为集合框架的一部分。
Vector 和 ArrayList 考虑到这几点后,我的结论是尽可能使用 ArrayList,避免使用 Vector 直到你别无选择。 如果有多个读取器和很少的写入器,考虑 CopyOnWriteArrayList
而不是 Vector,因为它可以提供线程安全性而不会过多影响性能。
相关文章
Do you understand JavaScript closures?
发布时间:2025/02/21 浏览次数:108 分类:JavaScript
-
The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.
Do you know about the hidden traps in variables in JavaScript?
发布时间:2025/02/21 浏览次数:178 分类:JavaScript
-
Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av
How much do you know about the Prototype Chain?
发布时间:2025/02/21 浏览次数:150 分类:JavaScript
-
The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start
如何在 JavaScript 中合并两个数组而不出现重复的情况
发布时间:2024/03/23 浏览次数:86 分类:JavaScript
-
本教程介绍了如何在 JavaScript 中合并两个数组,以及如何删除任何重复的数组。