2016-05-14 79 views
-2
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); 
    } 
} 

此输出工作:的ArrayLists未如预期

[1,1,999,1]

第二数组列表elements2有到ArrayList elements1复位到其初始位置。然而,由于某种原因,elements1正在被拷贝到elements2,打印

[1,1,999,1]

和不

[1,1,1,1 ]

+2

为什么你认为它应该打印'[1,1,1,1]'?需要注意的是'elements2','elements1'和'stuff'是整个程序的整个运行时间的***同***对象。改变一个的内容也会改变另外两个的内容。 – luk2302

+0

阅读本U移动之前http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html – emotionlessbananas

+0

和[1,1,1,1]你需要你将它添加999之前(重置复印一份) – emotionlessbananas

回答

2

你传入同一个ArrayList中,参照上述两个变量。

你的意思做的是:

public bugs(ArrayList<Integer> args) 
{ 
    elements1 = new ArrayList<Integer>(args); 
    elements2 = new ArrayList<Integer>(args); 
} 

编辑:

请注意,这只是一个临时的解决办法。调用reset()会将elements2的引用传递给elements1,然后你就会有相同的情况。如果您创建新的数组列表并将另一个列表作为参数传递,则可以使用相同的内容创建一个新的引用。这意味着您还必须调整您的reset()方法以创建一个新列表并将elements2作为参数传递。

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); 
}