Arrays.fill() 适配所有基本类型和引用类型数组,基本类型直接填值,引用类型填同一引用;索引范围统一为左闭右开,二维数组需手动逐层填充。

Arrays.fill() 能直接适配所有 Java 基本类型数组和引用类型数组,无需额外转换或包装,但每种类型有明确的语义约束和使用边界。
基本类型数组:值填充,安全高效
对 byte、short、int、long、float、double、char、boolean 这八种基本类型,Arrays.fill() 直接写入对应字面量值,底层由 JVM 优化,性能稳定:
-
int[] nums = new int[1000]; Arrays.fill(nums, -99);→ 每个元素是独立的整数 -99 -
boolean[] flags = new boolean[512]; Arrays.fill(flags, true);→ 只能传true或false,不能传1或"true" -
char[] buf = new char[256]; Arrays.fill(buf, '\0');→ 显式填空字符,比默认初始化更语义清晰
引用类型数组:填的是引用,不是新对象
对 String[]、Object[]、List[] 等,Arrays.fill() 把**同一个对象引用**复制到每个位置。这意味着:
-
String[] strs = new String[5]; Arrays.fill(strs, "N/A");→ 安全,字符串不可变,无副作用 -
StringBuilder[] sbArr = new StringBuilder[3]; Arrays.fill(sbArr, new StringBuilder());→ 危险!三个位置指向同一实例,sbArr[0].append("x")会影响全部 - 若需独立对象,必须用循环或
Arrays.setAll():Arrays.setAll(sbArr, i -> new StringBuilder());
边界与索引控制:统一规则,不因类型而异
所有重载版本都遵循相同索引语义:起始索引包含,结束索引不包含,且越界立即抛 ArrayIndexOutOfBoundsException:
立即学习“Java免费学习笔记(深入)”;
-
Arrays.fill(arr, 3, 8, 0)→ 填索引 3、4、5、6、7 共 5 个位置 -
fromIndex必须 ≥ 0,toIndex必须 ≤arr.length - 建议在不确定时加保护:
Arrays.fill(arr, Math.max(0, from), Math.min(arr.length, to), val);
二维及多维数组:靠分层调用,不自动递归
Java 的二维数组本质是“一维引用数组 + 每个元素指向一维数据数组”,Arrays.fill() 不识别维度层级:
-
int[][] mat = new int[10][20];→ 第一维是 10 个int[]引用 -
Arrays.fill(mat, new int[]{0,0,0});→ 错误:把同一个一维数组引用赋给所有行 - 正确做法:
for (int[] row : mat) Arrays.fill(row, 0);→ 每行单独填,互不影响


















