You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中将子List加入父集合后调用clear()出现已存列表大小为0问题

问题原因

这是Java引用传递机制导致的:

  • 你代码里全程只有一个ArrayList<Integer>实例,list变量是指向这个实例的引用
  • 调用result.add(list)时,并没有复制一份子列表存入result,只是把同一个实例的引用存进了result
  • 后续调用list.clear()时,修改的是这个唯一的ArrayList实例本身,所以result里已经存入的引用指向的对象也同步被清空了,就会出现你看到的第一个子列表大小为0的情况
  • 到第二个判断块执行时,你往同一个ArrayList里加了51个元素,此时result里存的两个引用都指向这同一个实例,所以两个子列表的大小都会显示为51

为什么替换成list = new ArrayList<>()就正常

当你执行new ArrayList<>()时,会在堆内存中创建一个全新的ArrayList实例,list变量会指向这个新实例,之前已经存入result的旧实例不会受任何影响,两个子列表分别指向两个独立的实例,操作互不干扰,结果就符合预期。

补充说明

如果确实想复用同一个list变量,也可以在存入result时传入副本,写法如下:

result.add(new ArrayList<>(list));
list.clear();

这种写法也能得到正确结果,但实际开发中直接new新的子列表可读性更高,也没有明显的性能损耗,更推荐使用。


内容的提问来源于stack exchange,提问作者chocalaca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:05