Collections.replaceAll用于批量替换List中所有等于oldVal的元素为newVal,要求List可修改且元素正确实现equals(),成功替换返回true,否则false。

Collections.replaceAll 是 Java 集合工具类中一个简单但实用的方法,用于批量替换 List 中所有等于指定旧值的元素为新值。它只适用于 List,且依赖元素的 equals() 方法进行匹配。
基本用法和前提条件
该方法签名如下:
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
它会遍历整个列表,将每个与 oldVal 通过 equals() 判定相等的元素,替换成 newVal。成功替换至少一个元素时返回 true;若没找到匹配项或列表为空,返回 false。
立即学习“Java免费学习笔记(深入)”;
注意点:
- 必须传入可修改的
List(如ArrayList、LinkedList),不可变列表(如Arrays.asList()返回的、List.of()创建的)会抛UnsupportedOperationException -
oldVal可以为null,此时匹配所有null元素 - 元素类型需正确重写
equals()(对自定义对象尤其重要)
常见使用示例
替换基础类型包装类:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "a", "c"));Collections.replaceAll(list, "a", "x"); // 结果:["x", "b", "x", "c"]
替换 null 值:
List<Integer> nums = Arrays.asList(1, null, 3, null);// 注意:Arrays.asList 返回的是固定大小列表,需包装成可修改的List<Integer> modifiable = new ArrayList<>(nums);Collections.replaceAll(modifiable, null, 0); // 结果:[1, 0, 3, 0]
替换自定义对象要注意什么
如果列表中是自定义对象(如 User),直接传入新构造的 new User("oldName") 作 oldVal 不会生效,除非该类重写了 equals() 和 hashCode(),且逻辑能正确识别“相等”。否则默认比较引用,永远不匹配。
推荐做法:
- 确保类中
equals()按业务字段(如 id 或 name)判断相等性 - 测试
obj1.equals(obj2)是否符合预期,再用于replaceAll - 避免用匿名内部类或未重写
equals的类做替换目标
替代方案与注意事项
如果列表不可修改,或需要更灵活的条件(比如按部分字段匹配、正则替换等),replaceAll 就不适用。此时可考虑:
- 用
list.replaceAll(e -> Objects.equals(e, oldVal) ? newVal : e)(Java 8+,要求列表支持 set 操作) - 手动遍历 +
set(i, newVal)(兼容所有 List 实现) - 用
Stream收集新列表(不修改原列表)
另外,该方法不是线程安全的,多线程环境下操作同一列表需额外同步。


















