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

