java - Arraylist 构造函数不创建新对象引用

标签 java

因此,当我将 Arraylist A 插入 Arraylist 构造函数时,我期望使用与 A 相同的对象集创建一个新的 Arraylist 对象 B。在我的例子中,我有

Arraylist<Arraylist<Integer>> powerSet
Arraylist<Arraylist<Integer>> OG

尽管 OG 是由 powerSet 构造的,但 powerSet 和 OG 似乎共享相同的引用:

ArrayList<ArrayList<Integer>> OG  = new ArrayList<>(powerSet);

完整代码如下:

public static ArrayList<ArrayList<Integer>> generatePower (ArrayList<Integer> s){
    ArrayList<ArrayList<Integer>> powerSet = new ArrayList<>();
    generatePower(s,powerSet);
    return powerSet;
}
public static void generatePower(ArrayList<Integer> s,ArrayList<ArrayList<Integer>> powerSet ){
    if(s.size()==0){
        powerSet.add(s);
        return;
    }
    else{
        int temp = s.remove(0);
        generatePower(s,powerSet);
        ArrayList<ArrayList<Integer>> OG  = new ArrayList<>(powerSet);
        for(ArrayList<Integer> el: OG){
            el.add(temp); //for some reason any changes I make to OG here is
                         //reflected in the powerSet
        }
        powerSet.addAll(OG);

    }
}

为什么 OG 和 powerSet 具有相同的引用以及如何使 OG 成为包含 powerSet 所有元素的新数组列表,而不让 OG 共享 powerSet 的引用

最佳答案

ArrayList 构造函数不会克隆元素;它只是复制引用。这是使用流进行深度复制的一种方法

List<List<Integer>> copy = powerSet.stream()
        .map(ArrayList::new)
        .collect(Collectors.toList());

关于java - Arraylist 构造函数不创建新对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45644417/

相关文章:

java - 使用 DOM 解析器时获取 XML 子节点

java - 如何生成包含涵盖代码中每个方法的测试用例列表的报告?

java - .equals() 方法不适用于多维数组

Java 套接字创建花费的时间太长

java - jformattedtextfield 四舍五入数字

java - if 语句中可以有两个条件吗

java - Web 服务抛出 ClassNotFoundException

java - 使用 JRE 路径设置 Eclipse

java - 使用 Java 应用程序写入 Windows 7 库

java - 如何进行基于Java的开放社交应用开发