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,因为它可以提供线程安全性而不会过多影响性能。