import java.util.ArrayList;
public class bugs
{
public ArrayList<Integer> elements1;
public ArrayList<Integer> elements2;
public bugs(ArrayList<Integer> args)
{
elements1 = args;
elements2 = args;
}
public void change(int index, int value)
{
elements1.set(index, value);
}
public void reset()
{
elements1 = elements2;
}
public static void main(String[] a)
{
ArrayList<Integer> stuff = new ArrayList<Integer>();
stuff.add(1);
stuff.add(1);
stuff.add(1);
stuff.add(1);
bugs b = new bugs(stuff);
b.change(2, 999);
b.reset();
System.out.println(b.elements2);
}
}
输出:
[1,1,999,1]
第二个arraylist elements2
用于将arraylist elements1
重置为原始位置。但是,出于某种原因elements1
被复制到elements2
,正在打印
[1,1,999,1]
而不是
[1,1,1,1]
答案 0 :(得分:2)
您正在将相同的ArrayList引用传递给这两个变量。
你打算做的是:
public bugs(ArrayList<Integer> args)
{
elements1 = new ArrayList<Integer>(args);
elements2 = new ArrayList<Integer>(args);
}
编辑:
请注意,这只是一个临时修复。调用reset()会将elements2的引用传递给elements1,然后你就会遇到相同的情况。如果创建新的arraylist并将另一个列表作为参数传递,则创建具有相同内容的新引用。这意味着您还必须调整reset()方法以创建新列表并将elements2作为参数传递。
答案 1 :(得分:0)
在java中,您可以通过引用或值传递。如果您使用的是原始数据类型,那么您将按值传递。所以:
public void method(int num)
{
int num1 = num;
int num2 = num;
}
此方法将num值传递给num1和num2基元数据类型。如果向num1添加内容,则不会将num2更改为相同的值。但是,如果您使用非原始数据类型,如ArrayList:
public bugs(ArrayList<Integer> args)
{
elements1 = args;
elements2 = args;
}
您应该期望elements1数组中的更改也会更改elements2数组。在此示例中,您将相同的ArrayList引用传递给两个变量。
您的问题的解决方案是创建阵列的副本:
public bugs(ArrayList<Integer> args)
{
elements1 = new ArrayList<>(args);
elements2 = new ArrayList<>(args);
}
public void reset()
{
elements1 = new ArrayList<>(elements2);
}