【发布时间】:2015-01-01 03:12:27
【问题描述】:
我看到了如何通过 ArrayList 的值传递一个 ArrayList,这样被调用的方法就不会修改原始的 Arraylist。 Passing ArrayList as value only and not reference 但是,我试图传递一个本身包含其他 Arraylist 的 ArrayList;也就是Arraylist的Arraylist。
public class Test {
public static void main(String[] args){
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
for(int j=0;j<2;j++){
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=5;i>0;i--){
list.add(i);
}
lists.add(list);
}
System.out.println("Before");
printLists(lists);
processLists(lists);
System.out.println("\nAfter");
printLists(lists);
}
public static void processLists(ArrayList<ArrayList<Integer>> list){
ArrayList<ArrayList<Integer>> myTrace=new ArrayList<ArrayList<Integer>>(list);
//myTrace.addAll(list);
for(int j=0;j<myTrace.size();j++){
myTrace.get(j).remove(myTrace.get(j).size()-1); //remove last element in the inner lists
}
System.out.println("\nInside");
printLists(myTrace);
}
public static void printLists(ArrayList<ArrayList<Integer>> lists){
for(int i=0;i<lists.size();i++){
for(int j=0;j<lists.get(i).size();j++){
System.out.print(lists.get(i).get(j)+" ");
}
System.out.println();
}
}
}
假设上面的代码生成输出为:
之前:5 4 3 2 1 \n 5 4 3 2 1
内部:5 4 3 2 \n 5 4 3 2
之后:5 4 3 2 \n 5 4 3 2
这里,processLists 方法正在改变“列表”的原始内容。如何限制这种修改?我已经尝试过链接中提到的解决方案。虽然它适用于单个 ArrayList,但不适用于 ArrayList 的 ArrayList。
【问题讨论】:
-
不要将引用传递与对象可变性混淆。
标签: java arraylist pass-by-reference