2016-05-14 55 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); 
}