2015-09-26 79 views
-1
public static void main(String[] args) { 
    List<List<Integer>> list = new ArrayList<List<Integer>>(); // final list 
    List<Integer> l = new ArrayList<Integer>(); // l is list 
    List<Integer> m = new ArrayList<Integer>(); // m is list 
    List<Integer> temp = new ArrayList<Integer>(); 

    l.add(1); 
    l.add(2); 
    l.add(3); // list l 

    m.add(4); 
    m.add(5); 
    m.add(6); // list m 

    temp.addAll(l); // add l to temp 
    list.add(temp); 
    System.out.println("temp: "+temp); 
    System.out.println("list: "+list); 


    temp.addAll(m); // add m to temp1 
    list.add(temp); 
    System.out.println("temp: "+temp); 
    System.out.println("list: "+list); 
} 

結果是列表,任何人都可以回答

temp: [1, 2, 3] 
list: [[1, 2, 3]] 
temp: [1, 2, 3, 4, 5, 6] 
list: [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]] 

我覺得應該是:

temp: [1, 2, 3] 
list: [[1, 2, 3]] 
temp: [1, 2, 3, 4, 5, 6] 
list: [[1, 2, 3], [1, 2, 3, 4, 5, 6]] 

爲什麼上次名單[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]]

+1

哪裏定義了temp1? –

回答

1

我將temp1重命名爲temp以便正確編譯。

這是因爲當你第一次執行「list.add(temp);」

list獲得對temp的引用。所以當temp的內容被改變時,list的內容也會被改變。

public static void main(String[] args) { 
    List<List<Integer>> list = new ArrayList<List<Integer>>(); // final list 
    List<Integer> l = new ArrayList<Integer>(); // l is list 
    List<Integer> m = new ArrayList<Integer>(); // m is list 
    List<Integer> temp = new ArrayList<Integer>(); 

    l.add(1); 
    l.add(2); 
    l.add(3); // list l 

    m.add(4); 
    m.add(5); 
    m.add(6); // list m 

    temp.addAll(l); // add l to temp1 
    list.add(temp); // list now references to temp. So when the content of temp is changed, the content of list also gets changed. 
    System.out.println("temp: "+temp); 
    System.out.println("list: "+list); 


    temp.addAll(m); // add m to temp. The content of temp is changed, so does the content of list 
    list.add(temp); 
    System.out.println("temp: "+temp); 
    System.out.println("list: "+list); 
} 
+0

感謝您的回答。 –

+0

不客氣:) – Brian

1

list列表結束了兩個引用相同的列表(temp)。通過創建第二個臨時列表,將temp的內容添加到它,然後添加4,5和6,然後將該臨時列表添加到list,可以實現所需的行爲。

0

我假設代碼中沒有temp1變量,它與temp相同。 第一次在「list」中添加「temp」後,第一個元素的內容在更改temp時發生了變化,這讓您感到驚訝。你缺少的是「列表」是參考文獻的列表,因此它的第一個元素是參考到「temp」,而不是其內容的副本。因此,無論何時「temp」發生變化,即使「」list「的內容沒有變化,也會在打印輸出中報告。」

您可以通過添加一些內容來檢查此行爲,例如「temp」打印之前,不更改「列表」。你會看到100會出現在打印輸出中。

+0

非常感謝,我知道「參考名單」的含義。 –

+0

@JZHOU歡迎您。但是,然後沒有看到有什麼問題。 :) –