Java中调用clear()后添加的列表为空?求问题原因
为什么调用
abc.clear()会导致abc2中的元素为空? 你遇到的这个问题,核心原因其实是Java里对象引用的工作机制,咱们一步步来理清楚:
首先,你只创建了一个LinkedList<Integer>对象,也就是abc。当你执行abc2.add(abc)的时候,你并不是把abc里的元素复制一份放进abc2,而是把abc这个对象的引用存进了abc2里。简单说,abc2里的两个元素,其实都是指向同一个abc对象的“指针”——就像你用两个快捷方式打开同一个文件夹,修改文件夹里的内容,两个快捷方式打开的结果都会变。
所以当你调用abc.clear()时,你清空的是那个唯一的abc对象里的元素,那abc2里的两个引用指向的自然也是这个被清空后的对象,输出结果就变成两个空列表了。
要解决这个问题,有两种常见的思路:
思路一:每次循环创建新的列表对象
把abc的创建代码移到while循环内部,这样每一次循环都会生成一个全新的LinkedList对象,添加到abc2后,后续的操作不会影响之前已经添加的对象:
public static void main(String [] args) { List<List<Integer>> abc2= new LinkedList<>(); int j=2; while(j > 0) { List<Integer> abc= new LinkedList<>(); // 每次循环新建对象 for (int i = 1; i < 4; i++) { abc.add(i); } abc2.add(abc); j--; } abc2.stream().forEach(e-> System.out.println("," + e)); }
思路二:添加时传入原列表的副本
如果不想频繁创建新对象,可以在添加到abc2的时候,传入abc的副本。这样abc2里存储的是独立的新对象,和原abc互不影响:
public static void main(String [] args) { List<Integer> abc= new LinkedList<>(); List<List<Integer>> abc2= new LinkedList<>(); int j=2; while(j > 0) { for (int i = 1; i < 4; i++) { abc.add(i); } abc2.add(new LinkedList<>(abc)); // 传入原列表的副本 abc.clear(); j--; } abc2.stream().forEach(e-> System.out.println("," + e)); }
两种方法都能得到你预期的输出:,[1, 2, 3],[1, 2, 3]。
内容的提问来源于stack exchange,提问作者Ria Sachdeva
相关产品推荐
相关产品推荐

