先声明,后分配空间,再赋值
这是最基础、最显式的方法,适合初学者理解数组的本质。
- 声明数组:指定数组可以存储的元素类型 (
String[]) 和数组名。 - 分配内存:使用
new关键字为数组分配内存空间,指定数组长度。 - 赋值:通过索引(从 0 开始)为每个元素赋值。
public class StringArrayExample {
public static void main(String[] args) {
// 1. 声明一个 String 类型的数组,名为 names
String[] names;
// 2. 为该数组分配内存,可以存储 3 个 String 元素
names = new String[3];
// 3. 通过索引为每个元素赋值
names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";
// 打印数组内容
System.out.println("--- 方法一:分步初始化 ---");
System.out.println(names[0]); // 输出: Alice
System.out.println(names[1]); // 输出: Bob
System.out.println(names[2]); // 输出: Charlie
// 打印整个数组 (会输出类似 [Ljava.lang.String;@15db9742 的哈希码)
// 为了方便打印,通常使用 Arrays.toString()
System.out.println("整个数组: " + java.util.Arrays.toString(names));
}
}
特点:
- 步骤清晰,易于理解。
- 数组元素可以在声明后任意时间赋值。
- 如果只分配了空间而没有赋值,
String数组的默认值是null。
声明并分配空间,同时赋值
这是更常见、更简洁的写法,将声明、分配和初始化合并为一行。
public class StringArrayExample {
public static void main(String[] args) {
// 在一行中完成声明、分配空间和初始化
String[] fruits = new String[]{"Apple", "Banana", "Orange"};
System.out.println("\n--- 方法二:声明并初始化 ---");
System.out.println("整个数组: " + java.util.Arrays.toString(fruits));
}
}
特点:
- 代码更紧凑。
- 数组长度由初始化列表中的元素数量自动确定。
- 这是 Java 9 之前最推荐的初始化方式。
使用简洁的初始化语法 (Java 9+)
自 Java 9 开始,引入了一种更简洁的初始化语法,无需 new 关键字,这种方式被称为“数组初始化器”。
public class StringArrayExample {
public static void main(String[] args) {
// Java 9+ 的简洁初始化语法
String[] cities = {"Beijing", "Shanghai", "Guangzhou", "Shenzhen"};
System.out.println("\n--- 方法三:Java 9+ 简洁语法 ---");
System.out.println("整个数组: " + java.util.Arrays.toString(cities));
}
}
特点:
- 最简洁:代码量最少,可读性最高。
- 现代推荐:如果你使用的是 Java 9 或更高版本,这是初始化数组的首选方式。
- 注意:在 Java 8 及更早版本中,这种写法会编译报错。
使用 Arrays.setAll (Java 8+)
这种方法不适用于静态的、已知的列表,但对于动态生成非常有用,它允许你使用一个函数来为数组的每个元素赋值。
import java.util.Arrays;
public class StringArrayExample {
public static void main(String[] args) {
// 创建一个长度为 5 的 String 数组
String[] greetings = new String[5];
// 使用 Arrays.setAll 和 Lambda 表达式来填充数组
Arrays.setAll(greetings, index -> "Hello, " + index);
System.out.println("\n--- 方法四:动态生成数组内容 ---");
System.out.println("整个数组: " + Arrays.toString(greetings));
// 输出:
// 整个数组: [Hello, 0, Hello, 1, Hello, 2, Hello, 3, Hello, 4]
}
}
特点:
- 适用于程序化生成。
- 非常灵活,可以结合循环、条件判断等复杂逻辑。
- 是函数式编程风格在 Java 中的体现。
总结与对比
| 方法 | 代码示例 | 适用场景 | Java 版本要求 |
|---|---|---|---|
| 分步 | String[] arr; arr = new String[3]; arr[0] = "A"; |
初学者学习,或需要在运行时动态决定数组长度和内容。 | 所有版本 |
| 标准 | String[] arr = new String[]{"A", "B"}; |
最通用、最常用的初始化方式,适用于所有 Java 版本。 | 所有版本 |
| 简洁 | String[] arr = {"A", "B"}; |
现代首选,当元素列表已知且固定时,代码最简洁。 | Java 9+ |
| 动态 | Arrays.setAll(arr, i -> "Item " + i); |
需要根据某种规则或逻辑动态生成数组内容时。 | Java 8+ |
一个重要的区别:可变性与 final
如果你希望数组本身不能被重新赋值(即不能指向另一个数组),但数组可以修改,可以使用 final 关键字。
final String[] finalArray = {"A", "B", "C"};
// 以下操作是允许的:修改数组内部元素
finalArray[0] = "X"; // 合法
System.out.println(Arrays.toString(finalArray)); // 输出: [X, B, C]
// 以下操作是非法的:让 finalArray 指向一个新的数组
// finalArray = new String[]{"D", "E"}; // 编译错误: Cannot assign a value to final variable finalArray
最佳实践建议
- 如果使用 Java 9 或更高版本:优先选择方法三的简洁语法
String[] arr = {"A", "B"};。 - 如果使用 Java 8 或更早版本:使用方法二的标准语法
String[] arr = new String[]{"A", "B"};。 - 如果数组内容需要动态生成:使用方法四的
Arrays.setAll或结合循环进行初始化。 - 如果希望数组引用本身不可变:使用
final修饰符。
