arrays.fill()为对象数组批量赋值同一引用,所有元素指向同一对象;适用于null、字符串字面量、枚举等不可变对象,但填充可变对象会导致共享修改问题,需用循环或stream创建独立实例。

Java中Arrays.fill()方法可用于为对象数组批量赋值同一个引用,但需注意:它填充的是**引用本身**,不是新创建的对象实例。这意味着所有数组元素将指向内存中的同一个对象。
fill方法的基本用法
对于对象数组,调用Arrays.fill(array, obj)会把obj这个引用复制到数组每个位置:
-
array必须是非空的已初始化对象数组(如String[]、MyClass[]等) -
obj可以是任意对象引用,包括null - 该操作不调用构造函数,不创建新对象,仅复制引用
关键注意事项:共享引用问题
如果填充的是可变对象(如ArrayList、自定义的非final类),后续修改任一元素的内容,会影响所有数组位置,因为它们实际指向同一对象:
ArrayList<string> sharedList = new ArrayList();
String[] arr = new String[3];
Arrays.fill(arr, sharedList); // 所有元素都指向sharedList
arr[0].add("hello"); // 修改arr[0]即修改sharedList
System.out.println(arr[1].size()); // 输出1 —— arr[1]也变了!
</string>
若需要独立对象,不能依赖fill(),应改用循环配合new或工厂方法。
正确使用场景示例
适合填充不可变对象或明确接受共享语义的情况:
- 填充
null:Arrays.fill(myArray, null) - 填充字符串字面量:
Arrays.fill(strArray, "N/A")(字符串常量池中同一实例) - 填充枚举常量:
Arrays.fill(statusArray, Status.PENDING) - 填充已预创建的不可变对象(如
BigInteger.ONE)
替代方案:需要独立实例时怎么做
若目标是为每个位置创建新对象(如不同ArrayList),请避免fill(),改用:
- 传统for循环:
for (int i = 0; i - Stream(Java 8+):
Arrays.setAll(arr, i -> new MyClass()); - 第三方库(如Guava)提供更简洁的工具
记住:fill()是“复制引用”,不是“复制对象”——这是理解其行为的核心。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











