因此,当我将 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/