collections.fill 用指定元素覆盖列表所有位置,要求列表可修改且非 null;它就地修改原列表,不返回新列表,仅适用于支持 set 操作的 list(如 arraylist),不适用于 arrays.aslist 返回的列表或不可变列表。

Collections.fill 是 Java 集合工具类中一个简单但实用的方法,它会用指定的元素**覆盖**列表中所有位置的现有元素,而不是添加或插入。注意:它要求传入的列表必须是可修改的(比如 ArrayList),且不能为 null。
基本用法:一行代码完成全部替换
调用方式非常直接:
Collections.fill(list, element);
其中 list 是目标 List,element 是要填入的统一对象。该方法不返回新列表,而是**就地修改原列表**。
- 如果列表为空,什么也不会发生,但不会报错
- 如果
element是null,则列表所有位置都会被设为null - 原始元素会被完全丢弃,引用关系被切断(对引用类型尤其要注意)
使用前提:列表必须支持 set 操作
不是所有 List 实现都适用。例如:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- ✅
ArrayList、LinkedList、Vector—— 支持set(i, e),可用 - ❌
Arrays.asList(...)返回的列表 —— 底层数组固定,set会抛UnsupportedOperationException - ❌ 不可变列表(如
Lists.newArrayList().asImmutable()或Collection.unmodifiableList())—— 同样会失败
若不确定,可先用 new ArrayList(originalList) 包装一下再操作。
注意事项:引用类型与值类型的区别
对基本类型包装类(如 Integer、String)或不可变对象,替换是安全的;但对可变对象需谨慎:
- 如果填入的是同一个对象实例(比如 new Date() 只创建一次),那么列表所有位置都指向**同一个对象**
- 后续修改该对象任一位置的属性,会影响整个列表——因为它们共享引用
- 如需独立副本,应配合循环或流式构造(
Collections.fill本身不负责克隆)
替代方案:当 fill 不适用时怎么办
如果列表不可修改,或需要更灵活控制(比如只填前 N 个),可以手动实现:
- 用
for循环逐个set:适合小列表或需条件判断 - 用
list.replaceAll(e -> newValue)(Java 8+):语义更清晰,也支持函数式逻辑 - 重建列表:
Arrays.fill配合Arrays.asList(仅限数组转列表场景)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










