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

Java嵌套ArrayList使用clone()修改元素后值全部重复问题求助

问题根因
  • ArrayList的clone()方法执行的是浅拷贝:仅外层的集合容器会生成新实例,容器内存储的所有子ArrayList<Integer>的引用仍指向原result中的子列表对象,没有生成独立的子列表副本。你对newResult中任意位置的子列表做追加操作,都会同步修改所有引用该对象的位置,最终所有子列表都被先后追加了0和1,导致输出不符合预期。
  • 初始化逻辑存在笔误:你定义one子列表时调用的是one.add(0),而非预期的one.add(1),会导致初始基准结果错误。
修复方案

实现嵌套集合的深拷贝,遍历原集合的每个子列表,逐个复制生成新的子列表后再存入新的外层集合,修正后的完整代码如下:

import java.util.ArrayList;

public class ArrayListNestedTest {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> newResult = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> zero = new ArrayList<Integer>();
        zero.add(0);
        ArrayList<Integer> one = new ArrayList<Integer>();
        one.add(1); // 修正笔误:初始添加1而非0
        result.add(zero);
        result.add(one);
        
        // 替换clone逻辑,做深拷贝
        ArrayList<ArrayList<Integer>> tmp1 = new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> tmp2 = new ArrayList<ArrayList<Integer>>();
        for (ArrayList<Integer> subList : result) {
            tmp1.add(new ArrayList<>(subList)); // 每个子列表单独拷贝
        }
        for (ArrayList<Integer> subList : result) {
            tmp2.add(new ArrayList<>(subList));
        }
        
        newResult.addAll(tmp1);
        newResult.addAll(tmp2);
        newResult.get(0).add(0);
        newResult.get(1).add(0);
        newResult.get(2).add(1);
        newResult.get(3).add(1);
        System.out.println(newResult); // 输出 [[0, 0], [1, 0], [0, 1], [1, 1]]
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:09:04