2017-08-11 73 views
1

所以,当我插入一个ArrayList阿成一个ArrayList构造我期待着与同一组对象为A.在我的情况下创建了一个新的ArrayList对象B我有ArrayList的构造没有创造新的对象引用

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

无论幂和OG似乎共享相同的基准,尽管正在建造从幂这样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是包含所有幂的元素,而新的ArrayList已经OG份额幂的参考

回答

0

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

此行传递的所有元素(复制引用)存储在powerSet中OG。

它的像例如以相同的方式工作:

List<User> usersList_1 = Arrays.asList(user1, user2, user3); 
List<User> usersList_2 = new ArrayList(userList_1); 

user1.setName("John"); 

userList_2.get(0).getName(); 

输出:John

1

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

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