核心概念
在 Java 中,数组是一个固定长度的、可以存储相同类型元素的容器,字符串数组就是专门用来存储 String 类型对象的容器。

声明一个字符串数组的语法有两种,它们在功能上是等价的:
String[] arrayName;(推荐,更直观,表示 "一个 String 类型的数组")String arrayName[];(从 C/C++ 继承而来,不推荐,容易混淆)
先声明,后初始化 (两步完成)
这种方式先创建一个数组变量,稍后再为数组分配内存空间并赋值。
1 声明并初始化为默认值
当你只声明数组并指定长度时,JVM 会为所有元素分配默认值。
- 对于
String数组,默认值是null。
public class StringArrayExample {
public static void main(String[] args) {
// 1. 声明一个可以存储 3 个字符串的数组
String[] names;
// 2. 初始化数组,分配内存空间
names = new String[3];
// 3. 查看数组中的默认值
System.out.println("数组的长度: " + names.length);
// 输出: 数组的长度: 3
System.out.println("第一个元素: " + names[0]);
// 输出: 第一个元素: null
System.out.println("第二个元素: " + names[1]);
// 输出: 第二个元素: null
System.out.println("第三个元素: " + names[2]);
// 输出: 第三个元素: null
// 4. 给数组元素赋值
names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";
// 5. 遍历并打印数组内容
System.out.println("\n赋值后的数组内容:");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
2 声明并初始化为指定值
如果你在声明数组时就知道了要存储的所有元素,可以使用这种简洁的方式。

public class StringArrayExample2 {
public static void main(String[] args) {
// 声明并直接初始化一个包含 4 个元素的字符串数组
String[] fruits = {"Apple", "Banana", "Orange", "Grape"};
// 打印数组长度
System.out.println("水果数组的长度: " + fruits.length); // 输出: 4
// 打印第一个元素
System.out.println("我喜欢的水果是: " + fruits[0]); // 输出: Apple
// 遍历数组 (使用 for-each 循环,更简洁)
System.out.println("\n所有水果列表:");
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
使用 Arrays 工具类
java.util.Arrays 类提供了许多用于操作数组(包括字符串数组)的实用方法。
1 使用 Arrays.copyOf() 复制数组
import java.util.Arrays;
public class ArraysCopyExample {
public static void main(String[] args) {
String[] originalColors = {"Red", "Green", "Blue"};
// 创建一个新数组,其长度和内容与 originalColors 相同
String[] copiedColors = Arrays.copyOf(originalColors, originalColors.length);
System.out.println("原始数组: " + Arrays.toString(originalColors));
System.out.println("复制后的数组: " + Arrays.toString(copiedColors));
// 修改复制后的数组,原始数组不受影响
copiedColors[0] = "Yellow";
System.out.println("\n修改复制后的数组后:");
System.out.println("原始数组: " + Arrays.toString(originalColors)); // 仍然是 Red
System.out.println("复制后的数组: " + Arrays.toString(copiedColors)); // 变为 Yellow
}
}
2 使用 Arrays.toString() 打印数组内容
直接打印数组变量名会得到内存地址的哈希码,不方便阅读。Arrays.toString() 可以将数组内容格式化为易读的字符串。
import java.util.Arrays;
public class ArraysToStringExample {
public static void main(String[] args) {
String[] cities = {"Beijing", "Shanghai", "Guangzhou", "Shenzhen"};
// 错误的打印方式
System.out.println(cities);
// 输出类似: [Ljava.lang.String;@15db9742
// 正确的打印方式
System.out.println("城市列表: " + Arrays.toString(cities));
// 输出: 城市列表: [Beijing, Shanghai, Guangzhou, Shenzhen]
}
}
3 使用 Arrays.sort() 排序数组
import java.util.Arrays;
public class ArraysSortExample {
public static void main(String[] args) {
String[] names = {"Charlie", "Alice", "David", "Bob"};
System.out.println("排序前: " + Arrays.toString(names));
// 对字符串数组进行字典序排序
Arrays.sort(names);
System.out.println("排序后: " + Arrays.toString(names));
// 输出: 排序后: [Alice, Bob, Charlie, David]
}
}
使用 List 和 Arrays.asList() (更现代的方式)
在实际开发中,我们更经常使用 List(列表),因为它比数组更灵活(长度可变,提供了更多便捷方法),你可以轻松地将数组转换为 List。
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class ListFromArrayExample {
public static void main(String[] args) {
// 1. 从数组创建一个固定大小的 List
String[] staticArray = {"A", "B", "C"};
List<String> fixedList = Arrays.asList(staticArray);
System.out.println("固定大小的 List: " + fixedList);
// fixedList.add("D"); // 这行代码会抛出 UnsupportedOperationException,因为大小固定
// 2. 从数组创建一个可变大小的 ArrayList (推荐)
// 先转换为 List,再用其构造函数创建一个新的 ArrayList
List<String> dynamicList = new ArrayList<>(Arrays.asList(staticArray));
System.out.println("可变的 ArrayList: " + dynamicList);
dynamicList.add("D"); // 现在可以安全地添加元素
System.out.println("添加元素后: " + dynamicList);
}
}
总结与最佳实践
| 场景 | 推荐方法 | 示例 | 优点 |
|---|---|---|---|
| 定义固定长度的字符串集合 | 直接初始化 | String[] arr = {"a", "b"}; |
代码简洁,一目了然。 |
| 先定义,后动态填充 | 声明后初始化 | String[] arr = new String[5]; |
灵活性高,适合运行时确定长度和内容的情况。 |
| 需要打印数组内容 | Arrays.toString() |
System.out.println(Arrays.toString(arr)); |
输出格式清晰,便于调试。 |
| 需要排序数组 | Arrays.sort() |
Arrays.sort(arr); |
提供了高效的排序算法。 |
| 需要动态添加/删除元素 | 转换为 ArrayList |
List<String> list = new ArrayList<>(Arrays.asList(arr)); |
List 接口更强大,是日常开发的首选。 |
核心要点:

String[]vsList<String>:数组长度固定,List长度可变,除非有特殊性能要求或需要与只能接收数组作为参数的旧 API 交互,否则在 Java 代码中优先使用List。null的处理:String数组的默认值是null,在使用数组元素前,最好进行null检查,避免NullPointerException。- 遍历方式:对于简单的遍历,推荐使用
for-each循环,代码更简洁且不易出错,如果需要索引,则使用传统的for循环。
