在声明时直接初始化(最常用)
这是最直接、最简洁的方式,在创建数组的同时,就为其指定初始值。

语法:
String[] arrayName = { value1, value2, value3, ... };
示例:
public class Main {
public static void main(String[] args) {
// 创建一个包含3个元素的String数组,并直接赋值
String[] fruits = { "Apple", "Banana", "Orange" };
// 打印数组内容
System.out.println(fruits[0]); // 输出: Apple
System.out.println(fruits[1]); // 输出: Banana
System.out.println(fruits[2]); // 输出: Orange
// 使用 for-each 循环遍历并打印整个数组
System.out.println("所有水果:");
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
先声明,后初始化
如果你需要先声明数组变量,然后再确定其内容,可以分两步完成。
步骤 1:声明数组
只声明数组的类型和名称,此时数组是 null。
步骤 2:初始化并赋值
使用 new 关键字创建数组,并指定大小,然后通过索引为每个元素赋值。
示例:
public class Main {
public static void main(String[] args) {
// 步骤 1: 声明一个 String 数组,fruits 是 null
String[] fruits;
// 步骤 2: 创建一个能容纳 3 个 String 元素的数组,并赋值给 fruits
// 此时数组中的每个元素都是 null
fruits = new String[3];
// 通过索引为每个元素赋值
fruits[0] = "Apple";
fruits[1] = "Banana";
fruits[2] = "Orange";
// 打印数组内容
System.out.println(fruits[0]); // 输出: Apple
System.out.println(fruits[1]); // 输出: Banana
System.out.println(fruits[2]); // 输出: Orange
}
}
注意:在使用 new 分配内存后,数组的每个元素都会被赋予一个默认值,对于 String 这样的引用类型,默认值是 null,如果你尝试访问一个未赋值的元素(fruits[3]),会抛出 ArrayIndexOutOfBoundsException 异常。

使用 Arrays.copyOf() 或 System.arraycopy() 复制数组
当你需要基于一个已存在的数组创建一个新数组时,这些方法非常有用。
Arrays.copyOf()
这个方法会创建一个新数组,并将原数组的内容复制过去,如果新数组的长度大于原数组,多余的元素会被填充默认值(String 为 null)。
示例:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] originalFruits = { "Apple", "Banana", "Orange" };
// 创建一个长度为 5 的新数组,并复制 originalFruits 的内容
String[] newFruits = Arrays.copyOf(originalFruits, 5);
System.out.println("新数组内容: " + Arrays.toString(newFruits));
// 输出: 新数组内容: [Apple, Banana, Orange, null, null]
}
}
Arrays.toString()是一个方便的方法,可以打印数组的字符串表示形式。
System.arraycopy()
这是一个底层方法,性能通常更好,但语法稍显复杂,它需要指定源数组、源起始位置、目标数组、目标起始位置和要复制的元素数量。

示例:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] source = { "A", "B", "C", "D" };
String[] destination = new String[6]; // 目标数组必须已经分配好空间
// 将 source 数组从索引 1 开始的 2 个元素 ("B", "C")
// 复制到 destination 数组的索引 2 的位置
System.arraycopy(source, 1, destination, 2, 2);
System.out.println("目标数组内容: " + Arrays.toString(destination));
// 输出: 目标数组内容: [null, null, B, C, null, null]
}
}
使用 Arrays.fill() 填充数组
如果你想用一个特定的值填充整个数组或数组的某个部分,可以使用 Arrays.fill()。
示例:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 创建一个长度为 4 的 String 数组
String[] status = new String[4];
// 用 "Pending" 填充整个数组
Arrays.fill(status, "Pending");
System.out.println("填充后的数组: " + Arrays.toString(status));
// 输出: 填充后的数组: [Pending, Pending, Pending, Pending]
// 从索引 1 开始,填充 2 个元素为 "Approved"
Arrays.fill(status, 1, 3, "Approved");
System.out.println("部分填充后的数组: " + Arrays.toString(status));
// 输出: 部分填充后的数组: [Pending, Approved, Approved, Pending]
}
}
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 声明时直接初始化 | 在创建时就已知。 | 代码最简洁、可读性高。 | 不适合数组内容需要动态确定的情况。 |
| 先声明,后初始化 | 需要后续逻辑确定,或者需要先确定数组大小。 | 灵活性高。 | 代码步骤稍多。 |
Arrays.copyOf() |
需要复制一个数组,并可能调整其大小。 | 使用方便,功能强大。 | 性能略低于 System.arraycopy。 |
System.arraycopy() |
需要在数组间进行高性能的复制,或进行部分复制。 | 性能最佳。 | 语法复杂,容易出错。 |
Arrays.fill() |
需要将数组的所有或部分元素设置为同一个值。 | 专门为填充设计,使用方便。 | 功能单一,仅用于填充。 |
核心要点:
- 声明 vs. 初始化:
String[] names;只是声明了一个变量,它还没有指向任何实际的数组对象。new String[3];才是真正的初始化,它在内存中分配了空间。 - 索引从 0 开始:Java 数组的索引总是从
0开始,对于一个长度为n的数组,其有效索引范围是0到n-1。 - 不可变性:
String对象是不可变的,当你将一个String对象存入数组后,你无法改变这个String对象本身,但可以修改数组中某个索引位置所引用的String对象。
对于初学者和绝大多数日常开发场景,第一种(声明时直接初始化)和第二种(先声明后初始化) 是最需要掌握的核心方法。
