HOWTO · Java
在 Java 中将所有数组元素初始化为零
了解新建的 Java 数值数组何时会自动填零,以及如何将已有数组重置为零。
本页内容
新建的 Java 基本数值类型数组会自动将元素初始化为零,因此不必再做额外处理。若要把已有数组重置为零,可以使用 Arrays.fill(),也可以逐个赋值。引用类型数组(例如 Integer[])的元素则会初始化为 null。
数组初始化是 Java 教程 核心数据路径的一部分。
使用 for 循环将数组元素初始化为零
for 循环可以为已有数组的每个索引赋值。循环从索引 0 开始,并在到达 numbers.length 前结束,因此会访问所有有效元素。
下面的完整 Java 程序对几个短数组应用这些方法,并打印每种方法的结果:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ArrayInitialization {
public static void main(String[] args) {
int[] loopValues = {4, 8, 12};
for (int i = 0; i < loopValues.length; i++) {
loopValues[i] = 0;
}
System.out.println("for loop: " + Arrays.toString(loopValues));
int[] filledValues = {4, 8, 12};
Arrays.fill(filledValues, 0);
System.out.println("fill: " + Arrays.toString(filledValues));
List<Integer> repeatedValues = Collections.nCopies(3, 0);
Integer[] boxedValues = repeatedValues.toArray(new Integer[0]);
System.out.println("boxed values: " + Arrays.toString(boxedValues));
int[] numbers = {4, 8, 12};
int[] oldReference = numbers;
numbers = new int[numbers.length];
System.out.println("replacement: " + Arrays.toString(numbers));
System.out.println("old reference: " + Arrays.toString(oldReference));
int[] generatedValues = {4, 8, 12};
Arrays.setAll(generatedValues, index -> 0);
System.out.println("setAll: " + Arrays.toString(generatedValues));
int[] newValues = new int[3];
System.out.println("new array: " + Arrays.toString(newValues));
}
}
程序输出:
for loop: [0, 0, 0]
fill: [0, 0, 0]
boxed values: [0, 0, 0]
replacement: [0, 0, 0]
old reference: [4, 8, 12]
setAll: [0, 0, 0]
new array: [0, 0, 0]
使用 Java 中的 fill() 方法将数组元素初始化为零
Arrays.fill() 会将指定值写入数组的每个元素。对于基本数值类型数组,Arrays.fill(numbers, 0) 会直接把已有数组中的元素重置为零。如果只需修改数组的一部分,也可以使用该方法提供的范围重载。
使用 nCopies() 方法将数组元素初始化为零
Collections.nCopies(length, 0) 会返回一个不可变的 List<Integer>,其中包含重复的装箱整数值。调用 toArray(new Integer[0]) 转换后得到的是 Integer[],而不是 int[],也不会重置已有的基本类型数组。只有在需要列表或装箱数组时才适合使用它;它不能代替对原数组的修改。
通过重新赋值将数组元素初始化为零
将 new int[numbers.length] 赋给 numbers 后,该变量会指向一个新数组,其元素采用默认值。若其他变量仍指向原数组,它们看到的内容不会改变。重新赋值只替换一个引用,并不会清空所有引用所指向的旧数组。
使用 Arrays.setAll() 将数组元素初始化为零
Arrays.setAll() 会针对每个元素调用一个基于索引的生成器,并将生成的值存入数组。示例中的 index -> 0 会在每个索引处赋入相同的值。当值需要根据索引计算时,这种方法很有用;如果所有元素都要设为同一个常量,Arrays.fill() 更直接。
结论
新建的基本数值类型数组已经自动填入零。若要重置已有数组,Arrays.fill() 是直接的选择;for 循环能明确展示逐个赋值的过程,而 Arrays.setAll() 适用于按索引生成值。Collections.nCopies() 会在列表中创建重复的装箱值;重新赋值则会创建新数组,同时让其他指向旧数组的引用保持原样。