簡體   English   中英

要列出的對象 - >為什么我要創建一個新對象?

[英]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);

您正在修改現有的列表 列表允許復制,它不會阻止您添加兩次具有相同值的對象。 為了防止重復,您可以執行以下操作:

myHashSet = new HashSet<Bank>(bank);

接着:

banks = new List<Bank>(myHashSet);

設置不允許重復。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM