2013-07-01 57 views
3

我想明白爲什麼會發生以下情況:要列出的對象 - >爲什麼我必須創建一個新對象?

數據類型銀行

public class Bank { 
    String Blz; String Name; 

    public String getBlz() { 
     return Blz; 
    } 
    public void setBlz(String Blz) { 
     this.Blz = Blz; 
    } 
    public String getName() { 
     return Name; 
    } 
    public void setName(String Name) { 
     this.Name = Name; 
    }  
} 

這按預期工作:

public List<Bank> getSearchResult() {   
     List<Bank> banks = new ArrayList<>(); 
     Bank bank = new Bank(); 
     bank.setBlz("1"); 
     bank.setName("Berlin"); 
     banks.add(bank); 
     bank = new Bank(); 
     bank.setBlz("8"); 
     bank.setName("München"); 
     banks.add(bank); 
     return banks; 
    } 

名單竟爲第一要素1 /柏林和第二個8 /慕尼黑。但是,我不明白:

public List<Bank> getSearchResult() {    
     List<Bank> banks = new ArrayList<>(); 
     Bank bank = new Bank(); 
     bank.setBlz("1"); 
     bank.setName("Berlin"); 
     banks.add(bank); 
     //bank = new Bank(); 
     bank.setBlz("8"); 
     bank.setName("München"); 
     banks.add(bank); 
     return banks; 
    } 

如果我不創建一個新的對象庫如上所示,該列表包含兩次8 /慕尼黑。爲什麼會發生?我不明白這一點,因爲當我添加第一個元素時,它包含1 /柏林。然後我覆蓋這些值並添加第二個值。

感謝

+2

因爲'List'可以有重複,因爲你沒有創建新的對象,你修改現有的。如果你不想要,使用'Set'。 – Maroun

+1

因爲你添加了兩次? –

+0

局部變量'bank'的重用令人困惑。我會使用兩個變量。 – johnchen902

回答

1

您正在修改現有的List。列表允許重複,它不會阻止您添加具有相同值的對象兩次。爲了避免重複,你可以做這樣的事情:

myHashSet = new HashSet<Bank>(bank); 

然後:

banks = new List<Bank>(myHashSet); 

Set不允許重複。

6

如果沒有創建那麼對象..

..你修改現有的(相同的)對象

Java 不會自動複製/克隆/複製對象(即在賦值或傳遞給方法時)。

1

由於List未設置,並且可以將相同的對象兩次存儲爲單獨的元素。您在這裏添加兩次相同的對象。

banks.add(bank); 
... 
banks.add(bank); 
0

在第二個示例中,您具有相同的引用類型。所以引用類型已被覆蓋。而List可以包含多個相同類型的數據。

2

在第二個示例中,列表引用的是同一個對象。因爲您在第一個示例中構造了兩次銀行對象(即您稱爲構造函數),所以有兩個實例。

最爲典型的例子是,在銀行被添加到列表後,銀行變量可以被分配(即指向)其他東西。所以在第一個例子中,銀行得到了別的東西。

列表只是指向對象,因此您可以在列表中的不同位置具有相同的對象。

0

當您將Bank對象添加到列表中時,您有一個包含一個引用的列表,指向您的Bank對象。

然後,您可以修改該對象並再次將其添加到列表中。現在你的列表包含兩個指向一個對象的引用,它們的值等於你最後設置的值 - 8 /慕尼黑。

2

很簡單 - 你兩次存儲相同的對象在列表中。

讓我們一步在你的方法走一步:

List<Bank> banks = new ArrayList<>(); 
Bank bank = new Bank(); 

在這裏你創建一個新的ArrayList和Bank對象。比方說,新的銀行對象是銀行@ 100

bank.setBlz("1"); 
    bank.setName("Berlin"); 
    banks.add(bank); 

現在你在銀行規定承包商,客人@ 100,並將其添加到列表中。 您的數組列表如下所示:

如果您現在執行 Bank bank = new Bank(); 您創建了一個新的銀行對象,我們稱之爲Bank @ 200。 您將其設置爲「8」並將其添加到您的列表中。 您的列表現在是:

好的。現在讓我們假設你沒有創建一個新的行對象

列表是 ,現在你修改銀行對象,相同的銀行@ 100的對象。 bank.setBlz(「8」); bank.setName(「München」); 你的列表沒有改變,但它包含的對象中的值被改變了! 現在你把你的銀行對象名單,但是這是已經包含在列表中的相同的對象。該列表是

因此,它包含兩次相同的對象,而您碰巧將此對象修改爲「8」,「Munchen」。

如果你不希望這樣的事情發生,你不得不添加到列表如下: banks.add(new Bank(bank)); 這是假設一個copyu構造爲銀行定義和工作正常。

相關問題