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
相关产品推荐
相关产品推荐

