Java 中的一维数组

2025 年 8 月 5 日 | 阅读 7 分钟

一维(1D)数组是一种线性数据结构,它在连续的内存位置中存储相同数据类型的元素。

基本术语

  • 数组元素: 数组的各项被称为其元素,它们被存储在数组中,并且可以通过它们的索引号进行随机访问。
  • 数组索引: 在数组中,元素通过它们的索引来识别。数组索引从 0 开始。换句话说,数组中存在零基索引。
  • 数组长度: 数组中的元素数量决定了数组的长度。
  • 连续内存: 数组元素为了快速访问而背靠背地存储在内存中。

数组声明

在 Java 中,有两种声明一维数组的方法。

语法

示例

这会创建一个整数类型的数组。

数组实例化

声明后,我们需要实例化数组。这可以通过使用 **new** 关键字并指定数组大小来完成。

语法

示例

这会创建一个整数类型的数组,并可容纳 5 个元素。

数组初始化

我们在声明时初始化数组元素。初始化时,我们在花括号 {} 中初始化元素,元素之间用逗号分隔。

这会创建一个整数类型的数组,并可容纳 5 个元素。同样,我们可以使用其他数据类型。

实例化后(单独赋值)

我们可以使用其索引为单个元素赋值。例如:

示例:一维数组

编译并运行

输出

Array Elements are: 40 50 60 70 80 90  

数组的内存表示

数组中的所有元素都存储在连续的内存位置中。因此,如果进行数组初始化,数组的元素将按顺序存储在内存中。这使得对元素的有效操作和访问成为可能。

One-Dimensional Array in Java

内存计算

这是数组使用的总内存(物理大小)。数组占用的总内存可以通过以下公式计算:

注意:数组元素的大小取决于数据类型。例如,如果数组类型为 int,则每个元素为 4 字节。

如果一个数组有 5 个 int 类型元素,则数组占用的总内存将是 20 字节,因为 int 有 4 字节。

类似地,如果一个数组有 100 个 char 类型元素,则数组占用的总内存将是 200 字节,因为 char 有 2 字节。

数组的大小或长度

这是数组包含的元素数量(逻辑大小)。例如,如果一个数组包含 10 个元素,则数组的大小或长度将是 10。

数组索引

  1. 0(零基索引): 数组的第一个元素将是 arr[0]。
  2. 1(一基索引): 数组的第一个元素将是 arr[1]。
  3. n(n 基索引): 数组的第一个元素可以位于任何随机索引号。

数组操作

在一维数组中,我们可以执行以下操作:

操作描述
遍历访问每个元素(用于打印或处理)
插入添加一个元素(通常在末尾;在索引处需要移动)
删除移除一个元素(可能需要移动其他元素)
搜索查找一个值(线性搜索或二分搜索)
排序按顺序重新排列元素(各种算法:冒泡、归并等)
更新更改特定索引处的值

一维数组遍历

顺序遍历数组以访问和处理元素称为数组遍历。数组遍历是计算机编程中最基本的操作之一。因为数组是常用且频繁使用的数据结构,用于在一个变量中存储多个元素。

在数组遍历中,每个元素都从头到尾访问,或者有时按反序(即从尾到头)访问。数组遍历通常借助循环来完成。

数组遍历的工作原理

每当创建一个数组时,都会分配一块连续的内存,元素以索引方式存储。在数组中,可以通过索引访问每个元素,在大多数计算机编程语言中,索引从 0 开始。

例如,观察以下包含六个整数的数组:

在这里,40 位于第 0 个索引处,可以通过 arr[0] 访问。50 位于第 1 个索引处,可以通过 arr[1] 访问。60 位于第 2 个索引处,可以通过 arr[2] 访问。类似地,最后一个元素 90 位于索引 5 处,可以通过 arr[5] 访问。

数组遍历的类型

线性(顺序)遍历: 它包括从头到尾遍历数组的元素。这是最常见的数组遍历,用于搜索元素、打印元素和进行计算。

示例:线性遍历数组

编译并运行

输出

Array Elements are: 40 50 60 70 80 90  

反向遍历: 它包括从头到尾遍历数组的元素。它用于按相反顺序处理元素。

示例:反向遍历数组

编译并运行

输出

Elements of the array in reverse order are: 90 80 70 60 50 40  

一维数组的关键特性

  • 线性结构: 元素存储在一条线上,一个接一个。
  • 同质: 数组中的所有元素必须是相同的数据类型。我们不能在同一个数组中混合整数和字符串。
  • 固定大小: 创建后我们无法更改其大小(可容纳的元素数量)。如果我们需要可调整大小的集合,通常会使用 ArrayList 或其他 Java Collections Framework 类。
  • 索引访问: 数组中的每个元素都使用整数索引进行访问。在 Java 中,数组索引是零基的。它从 0 开始,然后是 1,依此类推,直到 size - 1。

ArrayIndexOutOfBoundsException

如果我们尝试访问数组元素的无效索引范围(例如,小于 0 或大于或等于长度),我们将收到 `ArrayIndexOutOfBoundsException`。

示例

优点

  • 快速访问: 使用索引直接访问元素(O(1) 时间复杂度)。
  • 内存效率: 连续内存分配可能很有效。
  • 简单性: 对于固定大小的集合,易于理解和使用。

缺点

  • 固定大小: 创建后我们无法更改大小,如果元素数量波动,这可能效率低下。
  • 插入/删除: 在中间插入或删除元素需要移动后续元素,这可能很慢(O(n) 时间复杂度)。
  • 同质: 它不能存储不同类型的数据。

何时使用一维数组?

  • 当我们提前知道需要存储的元素的确切数量时。
  • 当我们对元素进行快速、随机访问的需求时。
  • 所有元素都属于相同的数据类型。
  • 元素的顺序很重要。

结论

一维数组是 Java 中存储相似项目列表的基本方式。它们易于使用,并且如果我们知道位置,可以非常快速地访问任何项目。这使得它们内存高效。但是,数组的大小是固定的。一旦创建,我们就无法更改其容量。此外,在中间添加或删除项目可能效率低下。

一维数组选择题

1. Java 中的一维数组存储着相同 ______ 的固定大小元素集合。

  1. 类实例
  2. 数据类型
  3. 内存地址
  4. 变量名
 

答案: b)

解释: Java 中的数组是同质的,这意味着所有元素都必须是相同的数据类型。


2. 当 Java 中的 int 数组在没有显式初始化的情况下实例化时,其元素会自动初始化为 ______ 的默认值。

  1. 垃圾值
  2. null
  3. 1
  4. 0
 

答案: d)

解释: 当实例化数组时,像 `int` 这样的基本数值类型会自动初始化为 `0`。


3. 要获取 Java 数组中的元素数量,可以使用其内置的 ______ 属性。

  1. length
  2. length()
  3. capacity
  4. size()
 

答案: a)

解释: `length` 属性直接提供了数组可容纳的元素数量。


4. 在遍历数组并且不需要访问索引时,______ 循环(也称为 for-each 循环)通常因其简洁性而受到青睐。

  1. 传统 for
  2. 增强 for
  3. while
  4. do-while
 

答案: b)

解释: 增强 `for` 循环(for-each 循环)用于遍历集合和数组,而无需显式管理索引。


5. 使用一维数组的优点之一是使用索引进行 ______ 访问元素,这非常高效。

  1. 间接
  2. 有限
  3. 顺序
  4. 随机
 

答案: d)

解释: 数组允许随机访问(也称为直接访问),这意味着可以使用索引在恒定时间内检索任何元素。