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,因为它可以提供线程安全性而不会过多影响性能。
相关文章
在 Java 中获取文件大小
发布时间:2023/05/01 浏览次数:139 分类:Java
-
Java 提供了不同的方法来获取文件的字节大小。 本教程演示了在 Java 中获取文件大小的不同方法。使用 Java IO 的文件类获取文件大小 Java IO 包的 File 类提供了以字节为单位获取文件大小的功能。
Java 中的文件分隔符
发布时间:2023/05/01 浏览次数:108 分类:Java
-
本篇文章介绍了 Java 中的文件分隔符。Java 中的文件分隔符 文件分隔符是用来分隔目录的字符; 例如,Unix 使用 /,Windows 使用 \ 作为文件分隔符。
Java 中的文件过滤器
发布时间:2023/05/01 浏览次数:193 分类:Java
-
本篇文章介绍如何在 Java 中使用 FileFilter。FileFilter 用于过滤具有特定扩展名的文件。 Java内置包IO和Apache Commons IO为FileFilter提供了类和接口来进行文件过滤操作。
Java 获取 ISO 8601 格式的当前时间戳
发布时间:2023/05/01 浏览次数:132 分类:Java
-
本篇文章介绍了 ISO 8601 日期格式、其重要性及其在 Java 中的使用。 它还列出了一些优点来强调为什么应该使用 ISO 格式来表示日期。
在 Java 中获取数组的子集
发布时间:2023/05/01 浏览次数:142 分类:Java
-
本篇文章介绍了几种在 Java 中获取数组子集的方法。使用 Arrays.copyOf() 方法获取数组的子集 使用 Arrays.copyOfRange() 方法获取数组的子集
用 Java 填充二维数组
发布时间:2023/05/01 浏览次数:110 分类:Java
-
二维数组是基于表结构的,即行和列,填充二维数组不能通过简单的添加到数组操作来完成。 本篇文章介绍如何在 Java 中填充二维数组。
计算 Java 数组中的重复元素
发布时间:2023/05/01 浏览次数:202 分类:Java
-
本篇文章介绍Java计算数组中重复元素的方法。计算 Java 数组中的重复元素。我们可以创建一个程序来计算数组中的重复元素。 该数组可以是未排序的,也可以是已排序的。
Java 中 List 和 Arraylist 的区别
发布时间:2023/05/01 浏览次数:90 分类:Java
-
表示为单个单元的一组单个对象称为集合。 在 Java 中,Collection 是一个具有多个已定义接口和类的框架,用于将一组对象表示为一个单元。 它允许我们操纵