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

如何在Java构造方法中正确克隆List并分配给多个独立集合使用?

Java List克隆实现错误排查

现有实现核心错误

  • 填充元素逻辑完全错误:new ArrayList<>(10000)指定的是初始容量不是列表长度,此时list.size()返回值为0,循环条件i < list.size()永远不成立,不会向列表中插入任何元素。如果强行修改循环条件为固定数值,循环过程中add操作会持续增大list.size(),会导致无限循环最终OOM。
  • 没有实现List克隆:7个成员变量全部指向同一个List对象的引用,后续任意方法修改其中一个列表,其余6个列表都会同步变更,完全不符合“7份独立集合各自处理”的需求。
  • 语法错误:Java类定义缺少class关键字,方法定义缺少返回值类型。

修复后代码示例

public class Class1 {
    public Class2 arrayList = new Class2(new ArrayList<>(), 10000);
    public Class2 linkedList = new Class2(new LinkedList<>(), 10000);
    public Class2 cowList = new Class2(new CopyOnWriteArrayList<>(), 10000);
}

public class Class2 {
    private List<Integer> list;
    private List<Integer> list2;
    private List<Integer> list3;
    private List<Integer> list4;
    private List<Integer> list5;
    private List<Integer> list6;
    private List<Integer> list7;

    public Class2(List<Integer> originList, int fillSize) {
        // 先填充原始列表
        for (int i = 0; i < fillSize; i++) {
            originList.add(1);
        }
        // 独立克隆7份,保持和传入列表相同的实现类型
        this.list = cloneList(originList);
        this.list2 = cloneList(originList);
        this.list3 = cloneList(originList);
        this.list4 = cloneList(originList);
        this.list5 = cloneList(originList);
        this.list6 = cloneList(originList);
        this.list7 = cloneList(originList);
    }

    // 通用List克隆方法,适配所有List实现类
    private List<Integer> cloneList(List<Integer> origin) {
        try {
            List<Integer> clone = origin.getClass().newInstance();
            clone.addAll(origin);
            return clone;
        } catch (InstantiationException | IllegalAccessException e) {
            // 异常兜底,返回ArrayList副本
            return new ArrayList<>(origin);
        }
    }

    public void method1(){
        // 处理list
    }

    public void method2(){
        // 处理list2
    }
    // 其余方法省略
}

补充说明

如果是JDK 8及以上版本,也可以用Stream简化克隆逻辑:List<Integer> clone = origin.stream().collect(Collectors.toCollection(origin::getClass));,不需要手动处理反射实例化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:04