Java 中的字符串数组是一个可以存储多个 String 对象的容器,下面我将从最基础的语法开始,逐步介绍不同的定义和初始化方式,并提供详细的代码示例。

基本语法
定义一个字符串数组的基本语法有两种,它们是等价的:
// 方式一:推荐,更具可读性 String[] arrayName; // 方式二:C/C++ 风格,同样有效 String arrayName[];
String: 表示数组中存储的元素类型是字符串。[]: 表示这是一个数组。arrayName: 你为数组指定的变量名。
重要提示:
仅仅使用上面的语法只是声明了一个可以引用字符串数组的变量 arrayName,此时它并没有指向任何实际的数组对象,它的值是 null,如果你试图在初始化数组之前使用它,会抛出 NullPointerException。
初始化数组
在声明数组后,你需要为它分配内存空间并赋值,这个过程称为初始化,初始化可以在声明时完成,也可以在之后完成。
1 声明时初始化
这是最常见的方式。

a) 创建固定长度的数组并赋值
// 声明、创建并初始化一个包含3个元素的字符串数组
String[] fruits = new String[]{"Apple", "Banana", "Orange"};
// 也可以省略 new String[],编译器会自动推断
String[] fruits2 = {"Apple", "Banana", "Orange"};
new String[3]: 创建了一个可以存放3个String对象的数组。{"Apple", "Banana", "Orange"}: 在创建的同时,为数组的每个元素赋上初始值。- 注意:数组的长度是固定的,一旦创建,就不能改变,在这个例子中,
fruits数组的长度永远是 3。
b) 创建固定长度的数组,稍后赋值
如果你知道数组需要多大,但暂时不知道具体要存什么值,可以先创建一个固定大小的数组,之后再赋值。
// 声明并创建一个长度为 5 的字符串数组,所有元素初始值为 null String[] students = new String[5]; // 稍后为数组的特定位置赋值 students[0] = "张三"; students[1] = "李四"; students[2] = "王五"; // students[3] 和 students[4] 仍然是 null
new String[5]: 创建了一个长度为 5 的数组。students[0]: 通过索引(index)访问数组中的元素。Java 数组的索引从 0 开始。
访问和操作数组
1 获取数组长度
使用 length 属性来获取数组的长度。
String[] languages = {"Java", "Python", "C++"};
int length = languages.length; // length 的值是 3
System.out.println("数组的长度是: " + length);
2 访问元素
通过索引来访问或修改数组中的元素。
String[] languages = {"Java", "Python", "C++"};
// 访问第一个元素
String firstLang = languages[0]; // firstLang 的值是 "Java"
System.out.println("第一种语言: " + firstLang);
// 修改第二个元素
languages[1] = "JavaScript";
System.out.println("修改后的第二种语言: " + languages[1]); // 输出 "JavaScript"
3 遍历数组
遍历(或迭代)是指访问数组中的每一个元素,有几种常见的方法:

a) 使用 for 循环(传统方式)
String[] languages = {"Java", "Python", "C++"};
System.out.println("--- 使用 for 循环遍历 ---");
for (int i = 0; i < languages.length; i++) {
System.out.println("语言: " + languages[i]);
}
b) 增强 for 循环 (for-each loop)(推荐)
这是最简洁、最安全(不用担心索引越界)的遍历方式,适用于只需要读取数组元素而无需修改的场景。
String[] languages = {"Java", "Python", "C++"};
System.out.println("--- 使用 for-each 循环遍历 ---");
for (String lang : languages) {
System.out.println("语言: " + lang);
}
String lang: 定义一个临时变量lang,它会依次接收数组languages中的每一个元素。- 关键字,表示“在...中”。
完整示例代码
下面是一个完整的示例,展示了字符串数组的定义、初始化、访问、修改和遍历。
public class StringArrayExample {
public static void main(String[] args) {
// 1. 声明并初始化一个字符串数组
String[] weekDays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
// 2. 打印数组的长度
System.out.println("工作日数组长度: " + weekDays.length);
// 3. 访问并打印第一个元素
System.out.println("第一天是: " + weekDays[0]);
// 4. 修改一个元素
weekDays[0] = "星期一"; // 将 "Monday" 改为 "星期一"
System.out.println("修改后的第一天是: " + weekDays[0]);
// 5. 使用 for-each 循环遍历并打印所有元素
System.out.println("\n--- 遍历所有工作日 ---");
for (String day : weekDays) {
System.out.println(day);
}
// 6. 创建一个固定长度但初始为 null 的数组,并填充
String[] hobbies = new String[3];
hobbies[0] = "编程";
hobbies[1] = "阅读";
// hobbies[2] 保持为 null
System.out.println("\n--- 我的爱好 ---");
for (String hobby : hobbies) {
// 在使用前检查是否为 null,避免 NullPointerException
if (hobby != null) {
System.out.println(hobby);
}
}
}
}
输出结果:
工作日数组长度: 5
第一天是: Monday
修改后的第一天是: 星期一
--- 遍历所有工作日 ---
星期一
Tuesday
Wednesday
Thursday
Friday
--- 我的爱好 ---
编程
阅读
可变长度数组:ArrayList<String>
在实际开发中,我们经常需要动态地添加或删除元素,而 Java 原始数组(String[])的长度是固定的,这时,java.util.ArrayList 是更好的选择。
ArrayList 是一个动态数组,可以根据需要自动调整大小。
ArrayList 的基本用法
import java.util.ArrayList; // 别忘了导入包
public class ArrayListExample {
public static void main(String[] args) {
// 1. 创建一个 String 类型的 ArrayList
ArrayList<String> names = new ArrayList<>();
// 2. 添加元素 (长度会自动增加)
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 3. 打印 ArrayList
System.out.println("当前列表: " + names); // 输出: [Alice, Bob, Charlie]
// 4. 访问元素
String firstPerson = names.get(0); // 获取索引为 0 的元素
System.out.println("第一个人是: " + firstPerson);
// 5. 在指定位置插入元素
names.add(1, "David"); // 在索引 1 的位置插入 "David"
System.out.println("插入后列表: " + names); // 输出: [Alice, David, Bob, Charlie]
// 6. 修改元素
names.set(2, "Eve"); // 将索引 2 的元素 "Bob" 修改为 "Eve"
System.out.println("修改后列表: " + names); // 输出: [Alice, David, Eve, Charlie]
// 7. 删除元素
names.remove("Alice"); // 删除值为 "Alice" 的元素
// names.remove(0); // 也可以通过索引删除
System.out.println("删除后列表: " + names); // 输出: [David, Eve, Charlie]
// 8. 获取大小 (相当于数组的 length)
System.out.println("列表大小: " + names.size());
// 9. 遍历 ArrayList
System.out.println("\n--- 遍历列表 ---");
for (String name : names) {
System.out.println(name);
}
}
}
String[] vs ArrayList<String>
| 特性 | String[] (原始数组) |
ArrayList<String> (动态数组) |
|---|---|---|
| 长度 | 固定,创建时必须指定 | 可变,可以动态添加或删除 |
| 性能 | 访问(get/set)速度极快 | 访问速度稍慢,但通常可以忽略不计 |
| 功能 | 功能较少,只能存储固定数量的元素 | 功能丰富,提供了添加、删除、查找等方法 |
| 语法 | 语法简洁 | 需要导入 java.util.ArrayList,语法稍显冗长 |
| 适用场景 | 数量固定且已知。 性能是首要考虑因素(如高性能计算)。 作为方法参数传递,要求是原始数组类型。 |
数量不固定,需要频繁增删。 需要使用集合框架提供的丰富功能。 绝大多数日常开发场景下的首选。 |
- 如果你确定需要存储多少个字符串,并且之后数量不会变,用
String[]。 - 如果你需要一个灵活的、可以随意增删字符串的列表,用
ArrayList<String>,在 Java 编程中,后者使用得更为普遍。
