如何利用 Arrays.fill 快速初始化一维数组
Arrays.fill是Java中为一维数组批量赋相同初始值最简洁安全的工具,支持全数组或区间填充(左闭右开),但不创建新对象、不适用于多维数组整体初始化,对象数组填充时需防引用共享。
初学Ja va时,我们常常需要给数组批量赋一个初始值。最直接的想法是写个for循环,但每次都要手动处理边界、检查索引,实在是又繁琐又容易出错。其实JDK早就准备好了一个利器——Arrays.fill。它简洁、安全,而且语义清晰,能让你用一行代码搞定一维数组的批量赋值。

一句话总结它的核心价值:Arrays.fill 是 Ja va 中为一维数组批量赋相同初始值最简洁安全的工具,支持全数组或区间填充(左闭右开),但不创建新对象、不适用于多维数组整体初始化,对象数组填充时需防引用共享。
基本用法:给整个数组赋同一值
最常见的场景就是初始化全部元素。只需传入数组和要填充的值,方法会自动遍历并赋值。它适用于任意类型数组,包括 int、double、String 以及自定义对象。原始类型数组直接填数值,引用类型数组可以填 null 或 new String("a") 这种具体引用。不过要记住一个关键点:对引用类型数组,fill 填入的是“同一个对象引用”,而不是新对象的副本——这一点后面会重点提醒。
示例:
int[] arr = new int[5];
Arrays.fill(arr, 7); // arr 变为 [7, 7, 7, 7, 7]
指定范围填充:只改其中一段
如果只想初始化子区间,比如前3个元素或后2个,可以用带起始和结束索引的重载版本。方法签名是 Arrays.fill(array, fromIndex, toIndex, value),其中 fromIndex 包含,toIndex 不包含——这符合 Ja va 通用的左闭右开区间习惯。需要注意索引越界,一旦越界会抛 IllegalArgumentException,因此建议确保 0 ≤ fromIndex ≤ toIndex ≤ array.length。
示例:
String[] names = new String[4];
Arrays.fill(names, 1, 3, "unknown"); // names 变为 [null, "unknown", "unknown", null]
常见误区与注意事项
用起来虽然快,但有几个坑很容易踩到。首先,对象数组填充时,Arrays.fill(arr, new Object()) 会让所有元素指向同一个实例——这意味着修改任一元素会影响全部,往往不是我们想要的结果。如果需要每个元素都是独立对象,应当配合循环或 Stream 来创建,比如 Arrays.setAll(arr, i -> new Object())。其次,这个方法不能用于多维数组的整体初始化——二维数组必须对每一行单独调用 fill。另外,如果数组为 null,调用 fill 会直接抛 NullPointerException,这一点也值得留意。
对比手动循环:为什么推荐 fill
虽然 for 循环也能实现同样的效果,但 Arrays.fill 优势明显。语义上一目了然:看到 fill 就知道是在“批量设值”,而不是在写复杂的逻辑处理。性能上也不输于手写循环,因为 JDK 内部通常做了优化,底层可能采用内存块复制。更重要的是,它能帮你减少出错:不用手写边界判断,也就避免了 i <= length 这类经典的 off-by-one 错误。而且这个方法从 JDK 1.2 就存在,兼容性完全不成问题。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















