List.set() 方法执行替换并返回被替换的旧值,需显式接收;索引越界抛 IndexOutOfBoundsException;返回值为原元素,可为 null,多线程需同步。

Java 中的 List.set() 方法本身不会返回被替换的旧值,它只执行替换操作并返回旧值——但这个返回值需要你主动接收,否则就丢失了。
set() 方法的签名和行为
List.set(int index, E element) 是 List 接口定义的标准方法,所有实现类(如 ArrayList、LinkedList)都必须支持。它的作用是:
- 将索引
index处的元素替换为新元素element; - 同时返回该位置原来的元素(即被替换掉的那个对象);
- 如果索引越界(
index = size()),抛出IndexOutOfBoundsException。
正确接收旧值的写法
关键在于:**把 set() 的返回值赋给一个变量**。例如:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
List<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
String oldValue = list.set(1, "B"); // 把索引 1 处的 "b" 替换为 "B"
System.out.println(oldValue); // 输出: "b"
System.out.println(list); // 输出: [a, B, c]
</string>
注意事项与常见误区
-
不能忽略返回值:写成
list.set(1, "B");而不接收,旧值就彻底丢弃了; -
类型需匹配:接收变量类型必须与 List 的泛型类型一致(如
List就要用Integer oldValue); -
null 也是合法旧值:若原位置存的是
null,set()仍会返回null,注意空指针风险; -
线程不安全:在多线程环境下直接调用
set()需自行同步,或改用线程安全的集合(如Collections.synchronizedList())。
替代方案(仅当需要原子性或额外逻辑时)
如果你不仅想获取旧值,还想在替换前后做校验或日志,可手动先读再写(但注意并发下可能不一致):
int idx = 1; if (idx >= 0 && idx
不过,这本质上重复了 set() 内部已做的检查,除非有特殊需求,否则直接用其返回值更简洁可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










