[英]Object to list -> why do I have to create a new object?
我想了解為什么會發生以下情況:
數據類型庫
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;
}
該列表有第一個Element 1 / Berlin和第二個8 /München。 但這個我不明白:
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 /München。 為什么會這樣? 我不明白這一點,因為當我添加第一個元素時它包含1 /柏林。 然后我覆蓋值並添加第二個。
謝謝
如果你沒有創建一個新對象,那么..
..您修改現有(相同)對象 。
Java 不會自動復制/克隆/復制對象(即在分配時或傳遞給方法時)。
在第二個示例中,列表指的是同一個對象。 因為您在第一個示例中構造了兩次bank對象(即您已經調用了構造函數),所以有兩個實例。
在fiest示例中,在將銀行添加到列表之后,可以將銀行變量分配(即指向)其他內容。 所以在第一個例子中,銀行得到了別的東西。
列表只是指向對象,因此您可以在列表中的不同位置擁有相同的對象。
這很簡單 - 你在列表中存儲了兩次相同的對象。
讓我們一步一步地介紹你的方法:
List<Bank> banks = new ArrayList<>();
Bank bank = new Bank();
在這里,您將創建一個新的ArrayList和一個Bank
對象。 假設新的Bank對象是Bank @ 100
bank.setBlz("1");
bank.setName("Berlin");
banks.add(bank);
現在,您在Bank @ 100中設置成員並將其添加到列表中。 你的數組列表如下所示:
如果你現在執行Bank bank = new Bank(); 你創建了一個新的銀行對象,我們稱之為Bank @ 200。 您將其設置為“8”並將其添加到列表中。 你的清單現在是:
好。 現在讓我們假設你沒有創建一個新的Bank對象
您的列表是,現在您修改您的銀行對象,相同的Bank @ 100對象。 bank.setBlz( “8”); bank.setName( “慕尼黑”); 您的列表沒有更改,但它包含的對象中的值已更改! 現在您將銀行對象添加到列表中,但這是已包含在列表中的完全相同的對象。 名單是
因此它包含兩次相同的對象,並且您碰巧將此對象修改為“8”,“Munchen”。
如果你不希望發生這種情況,你必須像這樣添加到列表中: banks.add(new Bank(bank));
這假設為Bank定義了一個copyu構造函數並且正常工作。
因為List未設置,並且可以將相同的對象存儲兩次作為單獨的元素。 您在此處兩次添加相同的對象。
banks.add(bank);
...
banks.add(bank);
在第二個例子中,您有相同的參考類型。 所以引用類型已被覆蓋。 而List可以包含多個相同類型的數據。
將Bank對象添加到列表時,您有一個包含一個引用的列表,指向您的Bank對象。
然后,您可以修改該對象並再次將其添加到列表中。 現在你的List包含兩個指向一個對象的引用,它的值等於你上次設置它們的值 - 8 /慕尼黑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.