2014-07-02 89 views
0

我有一個問題,或者我不明白的代碼片段: 這就是:值以我的ArrayList重寫

 List<Person> persons = new ArrayList<>(); 

     Person person = new Person(); 
     person.prename = "Klaus"; 
     for (int i = 0; i < 5; i++) { 
      person.surname = String.valueOf(i); 
      persons.add(person); 
      System.out.println(person.prename + ". " + person.surname); 
     } 
     System.out.println("======="); 

     for (Person person1 : persons) { 
      System.err.println(person1.prename + ". " + person1.surname); 
     } 

結果是:

Klaus. 0 
Klaus. 1 
Klaus. 2 
Klaus. 3 
Klaus. 4 
======= 
Klaus. 4 
Klaus. 4 
Klaus. 4 
Klaus. 4 
Klaus. 4 

爲什麼是值列表中的值被覆蓋?我怎樣才能防止這樣的結果?

+0

您要添加的幾參考到同一個'Person'對象。爲循環的每次迭代創建一個新的Person對象。 (這是*許多*問題的重複,但我懷疑很難快速找到一個...) –

+0

您的Person類是一個引用類型,因此您在循環內一次又一次地更新同一個引用。 –

回答

1

因爲您只使用一個對象,使該Object所以最後改改將僅適用於Object

Person person = new Person();//Move it inside loop 

聲明它的內部循環來創建新的Objects

在循環內移動以下語句。

Person person = new Person(); 
person.prename = "Klaus"; 

BTW

person.surname = String.valueOf(i);//I appreciate this rather than ""+i 
3

你只需要創建一個循環內的人。截至目前,您正在循環之外創建。

for (int i = 0; i < 5; i++) { 
      Person person = new Person(); 
      person.prename = "Klaus"; 
      person.surname = String.valueOf(i); 
      persons.add(person); 
      System.out.println(person.prename + ". " + person.surname); 
     } 
2

您每次插入相同的對象引用,然後更改內容 - 但對象引用仍然指向同一個人。解決方案:爲每次迭代創建一個新對象。

for (int i = 0; i < 5; i++) { 
    Person person = new Person(); 
    person.prename = "Klaus"; 
    person.surname = String.valueOf(i); 
    persons.add(person) 
    System.out.println(person.prename + ". " + person.surname); 
} 
1

你設置同一個人的5倍,試試這個:

Person person = null; 

     for (int i = 0; i < 5; i++) { 
      person = new Person(); 
      person.prename = "Klaus"; 
      person.surname = String.valueOf(i); 
      persons.add(person); 
      System.out.println(person.prename + ". " + person.surname); 
     }