Arrays.fill()对对象数组填充的是同一引用,所有元素指向同一实例;若对象可变,修改任一元素会影响全部;填充null或不可变对象(如String、Integer)则安全;需独立对象时应改用循环或Stream创建新实例。

Java中Arrays.fill()可以便捷地为数组所有元素赋相同值,但对对象数组使用时需注意引用特性——它填充的是引用,不是深拷贝。
理解Arrays.fill()对对象数组的作用
调用Arrays.fill(arr, obj)会把obj这个引用复制到数组每个位置。所有元素指向同一个对象实例。如果后续修改该对象的状态(如调用其setter方法),所有数组元素“看到”的都是同一份数据。
例如:
List<String> list = new ArrayList<>();String[] arr = new String[3];
Arrays.fill(arr, list);
// arr[0], arr[1], arr[2] 都引用同一个list实例
正确填充不同对象实例(避免共享引用)
若需每个数组元素是独立对象,不能依赖Arrays.fill()直接填新对象,而应配合循环或Stream创建新实例:
立即学习“Java免费学习笔记(深入)”;
- 用for循环逐个new:
MyClass[] arr = new MyClass[5];
for (int i = 0; i arr[i] = new MyClass(); // 每个都是新对象
} - 用IntStream生成(Java 8+):
MyClass[] arr = IntStream.range(0, 5)
.mapToObj(i -> new MyClass())
.toArray(MyClass[]::new);
使用null或不可变对象时相对安全
若填充null、字符串字面量(如"abc")、或其它不可变对象(如Integer.valueOf(42)),因无法修改其状态,共享引用不会引发意外行为:
Arrays.fill(names, "unknown"); // 安全,字符串不可变
常见误用与排查建议
当发现修改数组某一项影响其他项时,大概率是误用了Arrays.fill()填充了可变对象引用。排查方法:
- 检查填充的对象是否可变(如自定义类含public字段或setter)
- 打印对象哈希码:
System.out.println(arr[0].hashCode() + " == " + arr[1].hashCode());,若相等说明是同一实例 - 优先考虑是否真需要多个独立对象;若不需要,共享引用反而节省内存


















