杰瑞科技汇

Java String数组如何正确赋值?

声明并初始化(最常用)

这是最直接、最常见的方式,在创建数组的同时就为其赋值。

Java String数组如何正确赋值?-图1
(图片来源网络,侵删)

方式 1A:声明、创建并赋值(一步完成)

这种方式在代码中非常简洁,适合在确定初始值时使用。

// 语法:数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
// 对于 String 数组,可以简化为:
String[] fruits = new String[]{"Apple", "Banana", "Orange"};
// 更常见的简化写法(推荐)
String[] fruits2 = {"Apple", "Banana", "Orange"};
// 验证数组内容
System.out.println(fruits[0]); // 输出: Apple
System.out.println(fruits2[1]); // 输出: Banana

说明:

  • new String[]{...} 是完整的写法,显式地调用了构造函数。
  • 这种写法是 Java 的语法糖,编译器会自动为你完成 new String[] 的部分,代码更简洁,推荐使用。

方式 1B:先声明,再创建并赋值(分步完成)

当你需要先声明数组变量,然后在后续的代码逻辑中为其赋值时,这种方式很有用。

// 1. 声明一个 String 数组,此时数组为 null
String[] cities;
// 2. 创建数组并赋值
// 注意:这里必须使用 new 关键字来创建数组对象
cities = new String[]{"Beijing", "Shanghai", "Guangzhou"};
// 验证
System.out.println(cities[2]); // 输出: Guangzhou

先声明并创建,后逐个赋值

当你不知道数组的初始具体值,或者需要通过循环、计算等方式来填充数组时,这种方式非常灵活。

Java String数组如何正确赋值?-图2
(图片来源网络,侵删)

方式 2A:声明时指定长度,然后逐个赋值

// 1. 声明并创建一个长度为 3 的 String 数组
// 数组中的每个元素都默认为 null
String[] names = new String[3];
// 2. 通过索引逐个赋值
names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";
// 验证
System.out.println(names[0]); // 输出: Alice
System.out.println(names.length); // 输出数组长度: 3

⚠️ 重要注意事项:

  • 如果只声明并创建了数组,但没有为某个元素赋值,那么该元素的值就是 null
  • 尝试访问一个未赋值的元素会抛出 NullPointerException
String[] tempArray = new String[2];
System.out.println(tempArray[0]); // 输出: null
// tempArray[1] = "Hello"; // 如果取消这行注释,下一行就不会报错
System.out.println(tempArray[1].toLowerCase()); // 抛出 NullPointerException

方式 2B:使用循环赋值

这是逐个赋值的扩展,非常适合处理大量数据。

// 创建一个长度为 5 的数组
String[] weekDays = new String[5];
// 使用 for 循环赋值
for (int i = 0; i < weekDays.length; i++) {
    weekDays[i] = "Day " + (i + 1);
}
// 验证
for (String day : weekDays) {
    System.out.println(day);
}
// 输出:
// Day 1
// Day 2
// Day 3
// Day 4
// Day 5

从其他数组或集合赋值

在实际开发中,我们经常需要从一个已有的数组或集合(如 List)来创建一个新的数组。

方式 3A:使用 System.arraycopy()

这是一个高效的底层方法,用于在数组之间复制元素。

String[] sourceArray = {"A", "B", "C", "D"};
String[] targetArray = new String[4]; // 目标数组长度必须足够
// 从 sourceArray 复制到 targetArray
// 参数:源数组, 源起始索引, 目标数组, 目标起始索引, 复制长度
System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);
// 验证
System.out.println(targetArray[3]); // 输出: D

方式 3B:使用 Arrays.copyOf()

这是 System.arraycopy() 的一个便捷封装,更常用,代码更易读。

String[] original = {"Hello", "World", "Java"};
// 创建一个新数组,长度为 original.length,并将 original 的内容复制过去
String[] copied = Arrays.copyOf(original, original.length);
// 验证
System.out.println(Arrays.toString(copied)); // 输出: [Hello, World, Java]
// 也可以创建一个更长或更短的数组
String[] longer = Arrays.copyOf(original, 5); // 长度变长,多余位置填充 null
System.out.println(Arrays.toString(longer)); // 输出: [Hello, World, Java, null, null]
String[] shorter = Arrays.copyOf(original, 2); // 长度变短,只复制前面的元素
System.out.println(Arrays.toString(shorter)); // 输出: [Hello, World]

注意: 使用 Arrays.copyOf() 需要导入 java.util.Arrays 包。

方式 3C:从 List<String> 转换为数组

这是非常常见的场景,尤其是在使用 Java 8 Stream API 时。

import java.util.Arrays;
import java.util.List;
List<String> stringList = Arrays.asList("One", "Two", "Three");
// 方式一:传统方式(创建一个新数组)
String[] arrayFromList1 = stringList.toArray(new String[0]);
System.out.println(Arrays.toString(arrayFromList1)); // 输出: [One, Two, Three]
// 方式二:Java 8+ Stream API (推荐,更灵活)
String[] arrayFromList2 = stringList.stream().toArray(String[]::new);
System.out.println(Arrays.toString(arrayFromList2)); // 输出: [One, Two, Three]

注意: stringList.toArray(new String[0]) 这种写法中,传入的数组长度为 0 是一个技巧,JVM 会自动判断是否需要创建一个新数组,如果传入的数组能容纳所有元素,则直接使用该数组,否则创建一个新数组,这种写法既简洁又高效。


总结与最佳实践

场景 推荐方法 示例
创建时就确定初始值 直接初始化 String[] arr = {"A", "B", "C"};
先声明,后确定值 分步声明和初始化 String[] arr; ... arr = new String[]{"A", "B"};
需要动态填充元素 声明长度,循环赋值 String[] arr = new String[3]; ... for(...) ...
复制一个现有数组 Arrays.copyOf() String[] copy = Arrays.copyOf(original, original.length);
从 List 转换为数组 list.toArray(new String[0]) 或 Stream String[] arr = myList.toArray(new String[0]);

核心要点:

  1. 声明String[] myArray; 只是创建了一个引用,它指向 null
  2. 创建new String[size]new String[]{...} 实际在内存中分配了空间。
  3. 赋值:通过索引 myArray[0] = "value"; 来填充具体内容。
  4. null:String 数组的默认值是 null,访问未赋值的元素会引发 NullPointerException

希望这份详细的解释能帮助你完全理解 Java 中 String 数组的各种赋值方式!

分享:
扫描分享到社交APP
上一篇
下一篇