Java中Arrays.fill数组填充方法

Java中Arrays.fill数组填充方法
最新回答
泪海

2026-05-08 07:11:22

Arrays.fill() 是 Java 中用于快速填充数组的实用方法,支持全量或局部填充,但需注意对象数组的引用共享问题。 以下是详细说明:

1. 基本功能
  • 作用:将数组的所有元素或指定范围的元素设置为指定值,避免手动遍历赋值。
  • 所属类:java.util.Arrays。
  • 适用类型:支持所有基本类型(如 int、double)和对象类型(如 String、Object)的数组。
2. 核心语法
  • 全量填充:Arrays.fill(array, value)将整个数组的所有元素设置为 value。示例:

    int[] arr = new int[5];Arrays.fill(arr, 7); // 结果:arr = [7, 7, 7, 7, 7]
  • 局部填充:Arrays.fill(array, fromIndex, toIndex, value)仅填充数组中从 fromIndex(包含)到 toIndex(不包含)的元素。示例:

    int[] nums = {1, 2, 3, 4, 5};Arrays.fill(nums, 1, 4, 0); // 结果:nums = [1, 0, 0, 0, 5](索引1到3被设为0)
3. 关键注意事项
  • 索引范围:局部填充的 fromIndex 和 toIndex 遵循左闭右开原则(即包含 fromIndex,不包含 toIndex)。若 fromIndex 或 toIndex 越界,会抛出 ArrayIndexOutOfBoundsException。

  • 对象数组的引用问题:当填充对象数组时,所有元素会共享同一个对象引用。若后续修改该对象,数组中所有位置的元素会同步变化。问题示例:

    StringBuilder[] builders = new StringBuilder[3];Arrays.fill(builders, new StringBuilder("初始")); // 三个元素均引用同一个 StringBuilder 实例builders[0].append("追加"); // builders[1] 和 builders[2] 也会显示“初始追加”

    解决方案:需逐个创建新对象实例,避免直接填充同一对象:

    StringBuilder[] builders = new StringBuilder[3];for (int i = 0; i < builders.length; i++) { builders[i] = new StringBuilder("初始");}
4. 典型应用场景
  • 数组初始化:快速将数组所有元素设为默认值(如 0、null 或特定对象)。
  • 局部重置:在算法中重置数组的某一部分(如滑动窗口、动态规划状态更新)。示例:重置滑动窗口外的区域:int[] window = new int[10];Arrays.fill(window, 0); // 初始化全0// 滑动窗口移动时,重置离开窗口的区域Arrays.fill(window, 0, 2, -1); // 将索引0到1的元素设为-1
5. 性能与限制
  • 性能:Arrays.fill() 通过底层系统优化(如 System.arraycopy 或直接内存操作)实现高效填充,通常优于手动循环。
  • 限制:

    无法填充不同值(所有元素必须相同)。

    对多维数组需手动遍历每一维(如嵌套循环填充二维数组)。

6. 完整代码示例import java.util.Arrays;public class ArraysFillDemo { public static void main(String[] args) { // 基本类型数组全量填充 int[] intArray = new int[4]; Arrays.fill(intArray, 99); System.out.println(Arrays.toString(intArray)); // [99, 99, 99, 99] // 基本类型数组局部填充 double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5}; Arrays.fill(doubleArray, 1, 4, 0.0); System.out.println(Arrays.toString(doubleArray)); // [1.1, 0.0, 0.0, 0.0, 5.5] // 对象数组全量填充(注意引用问题) String[] strArray = new String[3]; Arrays.fill(strArray, "默认"); System.out.println(Arrays.toString(strArray)); // ["默认", "默认", "默认"] // 对象数组安全初始化(避免引用共享) StringBuilder[] safeBuilders = new StringBuilder[3]; for (int i = 0; i < safeBuilders.length; i++) { safeBuilders[i] = new StringBuilder("安全"); } safeBuilders[0].append("修改"); System.out.println(Arrays.toString(safeBuilders)); // ["安全修改", "安全", "安全"] }}

总结:Arrays.fill() 是 Java 中高效且简洁的数组填充工具,但需注意索引范围和对象引用的共享问题。合理使用可显著提升代码可读性和性能,尤其在算法实现中。