Java 数组基础
数组(Arrays)用于存储同一种数据类型的元素集合。理解如何声明和初始化数组,是高效管理和操作数据的关键。数组提供了一种结构化的方式来组织数据,使你能够只用一个变量名,就能对多个数值进行批量操作。
本章将全面覆盖数组声明的语法、不同的初始化方法,以及如何初步操作数组中的元素。
1. 声明数组 (Declaring Arrays)
在 Java 中,声明数组需要指定数组将要存放的元素类型以及数组变量的名称。
请注意:声明数组这个动作并没有真正在内存中创建数组,它仅仅是告诉编译器:“嘿,这个变量以后会用来存放某种特定类型的数组”。
1.1 数组声明语法
在 Java 中声明数组的通用语法如下:
数据类型[] 数组名; // 推荐写法
// 或者
数据类型 数组名[]; // 也是合法的,但不太常用数据类型 (dataType): 指定数组将要存储的元素类型(例如int、String、double或任何其他有效的 Java 类型)。[]: 中括号代表这个变量是一个数组。数组名 (arrayName): 你为这个数组变量起的名称。
示例:
int[] numbers; // 声明一个整数类型的数组
String[] names; // 声明一个字符串类型的数组
double[] prices; // 声明一个双精度浮点数类型的数组
boolean[] flags; // 声明一个布尔类型的数组在这些例子中,numbers、names、prices 和 flags 都是数组变量。在这个阶段,系统还没有为它们分配任何内存空间来存储元素。这些声明仅仅定义了每个变量将来会引用的数组类型。
2. 初始化数组 (Initializing Arrays)
声明数组后,你必须对其进行初始化,以便为它分配内存空间并为它的元素赋予初始值。Java 中有几种初始化数组的方法。
2.1 使用 new 关键字初始化
这是最常见的初始化方式。new 关键字会在内存中为数组开辟空间。
语法:
数组名 = new 数据类型[数组长度];数组名 (arrayName): 数组变量的名称。new: 用于分配内存的关键字。数据类型 (dataType): 数组存储的元素类型。数组长度 (arraySize): 数组可以容纳的元素个数。它必须是一个非负整数。
示例:
int[] numbers = new int[5]; // 创建一个可以容纳 5 个整数的数组在这个例子中,创建了一个名为 numbers 的数组,容量为 5。默认情况下,数组的每个元素都会被初始化为其数据类型的默认值。对于 int 类型,默认值是 0。
详细解释:
int[] numbers: 声明一个名为numbers的整数数组变量。new int[5]: 在内存中分配 5 个整数的空间。每个元素初始化为 0。=: 将新创建的数组的内存地址(引用)赋值给numbers变量。
3. 数组的默认值 (Default Values)
当你使用 new 关键字初始化数组时,Java 会根据元素的数据类型自动为其赋予默认值:
int,short,byte,long: 0float: 0.0fdouble: 0.0dboolean: falsechar: \u0000(空字符)- 对象引用 (例如
String):null
演示默认值的示例代码:
public class DefaultValues {
public static void main(String[] args) {
int[] intArray = new int[3];
double[] doubleArray = new double[3];
boolean[] booleanArray = new boolean[3];
String[] stringArray = new String[3];
System.out.println("整数数组默认值:");
for (int i = 0; i < intArray.length; i++) {
System.out.println("intArray[" + i + "] = " + intArray[i]);
}
System.out.println("\n双精度浮点数数组默认值:");
for (int i = 0; i < doubleArray.length; i++) {
System.out.println("doubleArray[" + i + "] = " + doubleArray[i]);
}
System.out.println("\n布尔数组默认值:");
for (int i = 0; i < booleanArray.length; i++) {
System.out.println("booleanArray[" + i + "] = " + booleanArray[i]);
}
System.out.println("\n字符串数组默认值:");
for (int i = 0; i < stringArray.length; i++) {
System.out.println("stringArray[" + i + "] = " + stringArray[i]);
}
}
}输出结果:
整数数组默认值:
intArray[0] = 0
intArray[1] = 0
intArray[2] = 0
双精度浮点数数组默认值:
doubleArray[0] = 0.0
doubleArray[1] = 0.0
doubleArray[2] = 0.0
布尔数组默认值:
booleanArray[0] = false
booleanArray[1] = false
booleanArray[2] = false
字符串数组默认值:
stringArray[0] = null
stringArray[1] = null
stringArray[2] = null4. 使用数组字面量初始化 (Array Literals)
数组字面量(Array Literals)提供了一种非常简洁的方式,可以在一条语句中完成数组的声明、初始化和赋值。当你在声明时就已经知道要存入数组的具体数值时,这种方法特别好用。
4.1 数组字面量语法
数据类型[] 数组名 = {值1, 值2, 值3, ...};{值1, 值2, ...}: 将一系列值用逗号分隔,并用大括号{}括起来。数组的长度会由你提供的值的数量自动决定。
示例:
int[] numbers = {1, 2, 3, 4, 5}; // 创建一个包含 5 个指定整数的数组
String[] names = {"Alice", "Bob", "Charlie"}; // 创建一个包含 3 个字符串的数组4.2 组合声明与初始化
使用数组字面量时,你可以将声明和初始化完美结合在同一行:
int[] numbers = {1, 2, 3, 4, 5};这在底层等价于:
int[] numbers;
numbers = new int[]{1, 2, 3, 4, 5};注意一个常见的错误: 你不能将简写的字面量赋值拆分到声明之后。下面这种写法会导致编译错误:
int[] numbers;
numbers = {1, 2, 3, 4, 5}; // 编译错误!如果拆分开写,Java 强制要求你在赋值时使用 new 关键字(如上面的 new int[]{...})。
5. 逐个初始化数组元素
你也可以通过数组的索引(Index)来单独访问并初始化每一个元素。
重点: 数组的索引从 0 开始,一直到 数组长度 - 1 结束。
5.1 单个元素初始化语法
数组名[索引] = 值;示例:
int[] numbers = new int[5]; // 创建一个长度为 5 的数组,默认全为 0
numbers[0] = 10; // 给第一个元素(索引 0)赋值 10
numbers[1] = 20; // 给第二个元素(索引 1)赋值 20
numbers[2] = 30; // 给第三个元素(索引 2)赋值 30
numbers[3] = 40; // 给第四个元素(索引 3)赋值 40
numbers[4] = 50; // 给第五个元素(索引 4)赋值 505.2 严重警告:数组越界异常
如果你试图访问一个不存在的索引(即索引小于 0,或者大于等于数组的长度),程序在运行时就会抛出 ArrayIndexOutOfBoundsException(数组索引越界异常),并导致程序崩溃。
错误示例:
int[] numbers = new int[5]; // 有效索引是 0, 1, 2, 3, 4
numbers[5] = 60; // 崩溃!抛出 ArrayIndexOutOfBoundsException6. 综合实战演练
让我们来看几个实际的代码例子,巩固声明和初始化数组的知识。
6.1 示例 1:存储学生成绩
假设你想将 5 个学生的成绩存储在一个数组中。你可以声明并初始化一个整数数组。
public class StudentGrades {
public static void main(String[] args) {
// 声明并初始化一个数组来存储学生成绩
int[] grades = new int[5];
// 为每个学生分配成绩
grades[0] = 85;
grades[1] = 90;
grades[2] = 78;
grades[3] = 92;
grades[4] = 88;
// 打印每个学生的成绩
System.out.println("学生成绩列表:");
for (int i = 0; i < grades.length; i++) {
System.out.println("学生 " + (i + 1) + ": " + grades[i]);
}
}
}6.2 示例 2:存储一周的日子
你可以使用字符串数组结合数组字面量来存储星期几的名称。
public class Weekdays {
public static void main(String[] args) {
// 使用数组字面量声明并初始化字符串数组
String[] weekdays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
// 打印日子名称
System.out.println("一周的日子:");
for (int i = 0; i < weekdays.length; i++) {
System.out.println(weekdays[i]);
}
}
}6.3 示例 3:计算数组元素的总和
这个例子演示了如何将数组里面的整数加起来。
public class ArraySum {
public static void main(String[] args) {
// 声明并初始化一个整数数组
int[] numbers = {1, 2, 3, 4, 5};
// 计算数组元素的总和
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
// 打印总和
System.out.println("数组元素的总和: " + sum);
}
}