Collections.fill()用于将可修改List的所有元素原地替换为同一对象,要求List支持set()操作,不适用于不可变列表或基本类型数组,且所有位置共享同一对象引用。

Collections.fill() 是 Java 集合工具类中一个简单但实用的方法,专门用于将 已存在且可修改的列表(List) 中所有元素统一替换为同一个指定对象(即“模板对象”)。它不创建新列表,也不改变列表大小,只做原地填充。
前提条件:列表必须是可修改的、非空且已初始化
该方法要求传入的 List 必须支持 set() 操作(比如 ArrayList、LinkedList),不能是不可变集合(如 Arrays.asList() 返回的固定大小列表,或 Collections.unmodifiableList() 包装过的列表)。否则会抛出 UnsupportedOperationException。
- ✅ 正确示例:new ArrayList(Arrays.asList("a", "b", "c"))
- ❌ 错误示例:Arrays.asList("a", "b", "c")(底层数组固定,set() 会报错)
- ⚠️ 注意:如果列表为空(size == 0),fill() 不报错,但也不执行任何操作
基本用法:一行代码完成批量覆盖
语法很简单:
Collections.fill(list, obj);
例如,把一个整数列表全部设为 99:
List<integer> nums = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)); Collections.fill(nums, 99); // 结果:[99, 99, 99, 99, 99]</integer>
再比如,填充自定义对象(注意:所有位置引用的是同一个对象实例):
List<person> people = new ArrayList(Arrays.asList(new Person(), new Person()));
Collections.fill(people, new Person("模板")); // 所有元素都指向这个新 Person 实例
// 若后续修改该对象,所有位置看到的是同一份数据(浅拷贝语义)</person>
常见误区与注意事项
- 不是“复制对象”,而是“复制引用”——所有位置都指向你传入的那个 obj 实例。若需独立副本,请自行循环 new 或使用 stream map
- 不适用于基本类型数组,需用 Arrays.fill() 替代(如 int[] arr = {...}; Arrays.fill(arr, 0);)
- 对 null 值完全合法:Collections.fill(list, null) 会把每个元素设为 null
- 线程不安全:多线程环境下需额外同步,该方法本身不做并发控制
替代方案对比(何时不用 fill)
如果你需要的是“每个位置都是新对象”,而不是共享同一实例,推荐以下方式:
- 用 Stream 生成新对象:list.replaceAll(x -> new Person("模板"))
- 用传统 for 循环:for (int i = 0; i
- 初始化时直接构造:Collections.nCopies(n, new Person("模板"))(返回不可变列表,需 new ArrayList(...) 包装才可修改)










