2016-03-27 48 views
0
public static void main(String[] args) { 
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); 
    ArrayList<Integer> out = new ArrayList<Integer>(); 
    for(int i =1;i<=2;i++) { 
     out.add(i); 
     result.add(out); 
    } 

    System.out.println(result.toString()); 
} 

为什么是输出: [[1,2],[1,2]]当它应该是[[1],[1,2] ]添加更新的ArrayList到数组列表的ArrayList代替以前的值

+2

您并未创建'out'副本。你只需修改同一个对象。 –

+2

这是OOP背后的核心理念。您只需添加两个_references_同一个列表。 – Mordechai

+0

那么你如何实现[[1],[1,2]]的输出呢? – tushR

回答

0

由于您正在修改out的相同引用,所以无处不在。为了冻结你的列表在特定的点上,你需要创建它的克隆并添加新的列表。

public static void main(String[] args) { 
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> out = new ArrayList<Integer>(); 
for(int i =1;i<=2;i++) { 
    out.add(i); 
    ArrayList<Integer> freeze = new ArrayList<Integer>(out); 
    result.add(freeze); 
} 

System.out.println(result.toString()); 
}