Java 中数组和 Vector 的区别

2025年9月1日 | 阅读 6 分钟

在处理数据集时,数组和向量是两个常用的编程结构。虽然它们都用于存储相同类型的多个元素,但它们的特性、性能、灵活性和内存管理却大不相同。

什么是数组?

数组是一种基本的数据结构,存在于大多数编程语言(包括 Java)中,可用于存储元素集合。所有这些元素都具有共同的数据类型,并存储在彼此相邻的内存区域中。数组用于组织数据,以便可以快速搜索或排序链接的值集合。

阅读更多 Java 数组

数组的特性

固定大小:数组的大小一旦指定就无法更改。这意味着我们在声明数组时需要知道并打算在其中存储多少个元素。

同质数据类型:数组的所有元素必须具有相同的数据类型。例如,整数数组只能存储整数,字符串数组只能存储字符串。

随机访问:由于数组允许对其元素进行随机访问,因此可以通过其索引号直接访问数组中的任何元素。由于数组的索引通常从 0 开始,因此第一个元素位于索引 0,第二个元素位于索引 1,依此类推。

连续内存分配:由于数组的元素在内存中是连续分配的,因此可以高效地访问它们。

数组示例

示例

编译并运行

输出

10
20
70
40
50

什么是向量?

向量是一种动态数组,可以根据需要更改大小。它是 Java 集合框架的一部分,实现了 List 接口,提供了一种按顺序存储元素的方法,类似于数组,但具有动态调整其大小的额外灵活性。

阅读更多 Java Vector

向量的特性

动态调整大小:与数组不同,向量可以动态地扩展或收缩,以容纳比最初指定的更多的元素,或者根据它们当前包含的元素来消耗更少的存储空间。

通过同步实现线程安全:Vector 类的所有方法都是同步的。这意味着 Vector 在并发情况下运行时不需要额外的同步代码,因为它本身就是线程安全的。

允许重复值和 null 值:与其他 List 实现一样,向量允许 null 值和重复元素。

随机访问能力:与数组类似,向量允许对其元素进行随机访问,从而可以按索引位置快速获取元素。

Java 集合框架中的遗留状态:在 Java 中,Vector 被认为是一个遗留类,它包含在第一个 JDK 1.0 中。尽管如此,它实现了 List 接口,并已得到修改以与集合框架配合使用。

向量示例

示例

编译并运行

输出

Vector after adding: [10, 20, 30]
First element: 10
After modification: [10, 99, 30]
After removal: [99, 30]
Iterating Vector:
99
30
Size of Vector: 2

数组和向量之间的区别

方面ArrayVector
大小声明后大小固定;运行时无法更改。大小动态;添加或删除元素时可以增长或缩小。
内存分配在创建时分配,一块连续的内存块。动态分配;需要时自动增加容量。
性能通常更快,因为没有同步或重新调整大小的开销。由于同步和重新调整大小的开销,速度略慢。
线程安全不同步;在多线程使用中需要手动同步。默认同步,线程安全。
内置方法没有用于插入、删除或搜索的内置方法;只有索引访问。提供 add()、remove()、contains()、clear() 等内置方法。
元素访问通过 array[index] 访问;时间复杂度为 O(1),速度快。通过 get(index) 或 elementAt(index) 访问;时间复杂度也为 O(1)。
数据类型同质;只能存储一种类型(原始类型或对象)。同质,可以定义泛型类型(例如,Vector<Integer>)。
初始化int[] arr = {1, 2, 3}; 或 new int[5];Vector<Integer> v = new Vector<>();
插入和删除必须手动完成;需要移动元素。内置方法会自动处理插入和删除。
用例当元素数量固定且提前可知时最佳。当元素数量在运行时可能发生变化,并且需要线程安全时最佳。

数组和向量的选择题

问 1. 关于 Java 中的数组,以下哪个陈述是正确的?

  1. 数组可以在运行时更改大小
  2. 数组可以存储多种数据类型的元素
  3. 数组将元素存储在连续的内存位置
  4. 数组默认提供同步访问
 

答案:C

解释: Java 数组通过将相同类型的所有成员存储在附近的(连续的)内存区域中,从而实现快速的基于索引的访问。它们不同步,并且一旦声明,大小就是固定的。


问 2. 以下 Java 代码的输出是什么?

  1. 10
  2. 20
  3. 99
  4. 编译错误
 

答案:C

解释:索引 1 处的元素被替换为 99。数组允许直接基于索引修改元素。


3. 以下 Java 代码的输出是什么?

  1. [A, C]
  2. [C, B]
  3. [A, B]
  4. 编译错误
 

答案: A

解释: set() 方法会替换给定索引处的元素。这里,索引 1 处的“B”被替换为“C”,因此向量变为 [A, C]。


问 4. 关于数组和向量之间的性能,以下哪个说法是正确的?

  1. 数组总是比向量慢
  2. 数组通常更快,因为它们没有同步开销
  3. 向量通常更快,因为它们是同步的
  4. 在所有情况下,两者的性能都相同
 

答案: B

解释:向量同步会增加性能开销,但能保证线程安全。总的来说,数组在单线程场景下性能更好,因为它们不同步。


问 5. 在哪种情况下,使用 Vector 而不是 Array 更好?

  1. 当元素数量固定时
  2. 当元素数量可能发生变化且需要线程安全时
  3. 当需要存储原始类型时
  4. 当元素必须存储在连续内存中时
 

答案: B

解释:由于向量是同步的且可动态调整大小,因此它们适用于具有不稳定集合大小的多线程系统。