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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:07:38