要列出的对象 - >为什么我要创建一个新对象?

时间:2013-07-01 11:26:09

标签: java

我想了解为什么会发生以下情况:

数据类型库

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 /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 /柏林。然后我覆盖值并添加第二个。

由于

7 个答案:

答案 0 :(得分:6)

如果您没有创建对象,那么..

..您修改现有(相同)对象

Java 不会自动复制/克隆/复制对象(即在分配时或传递给方法时)。

答案 1 :(得分:2)

在第二个示例中,列表引用同一个对象。因为您在第一个示例中构造了 bank 对象两次(即您已经调用了构造函数),所以有两个实例。

在fiest示例中,将 bank 添加到列表后,可以将bank变量分配(即指向)其他内容。所以在第一个例子中,银行得到了别的东西。

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

答案 2 :(得分:2)

这很简单 - 你在列表中存储了两次相同的对象。

让我们一步一步地执行您的方法:

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 @ 200。 您将其设置为“8”并将其添加到列表中。 你的清单现在是:

确定。现在让我们假设您没有创建新的Bank对象

你的清单是 现在你修改你的银行对象,相同的Bank @ 100对象。         bank.setBlz( “8”);         bank.setName( “慕尼黑”); 您的列表没有更改,但它包含的对象中的值已更改! 现在您将银行对象添加到列表中,但这是已包含在列表中的完全相同的对象。名单是

因此它包含两次相同的对象,并且您碰巧将此对象修改为“8”,“Munchen”。

如果您不希望发生这种情况,您必须像这样添加到列表中: banks.add(new Bank(bank)); 这假设为Bank定义了一个copyu构造函数并且工作正常。

答案 3 :(得分:1)

因为List未设置,并且可以将相同的对象存储两次作为单独的元素。你在这里两次添加相同的对象。

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

答案 4 :(得分:1)

您正在修改现有的List。列表允许重复,它不会阻止您添加两次具有相同值的对象。为了防止重复,你可以这样做:

myHashSet = new HashSet<Bank>(bank);

然后:

banks = new List<Bank>(myHashSet);

Set不允许重复。

答案 5 :(得分:0)

在第二个示例中,您具有相同的引用类型。所以引用类型已被覆盖。而List可以包含多个相同类型的数据。

答案 6 :(得分:0)

当您将Bank对象添加到列表时,您有一个包含一个引用的列表,指向您的Bank对象。

然后修改该对象并再次将其添加到列表中。现在你的List包含两个指向一个对象的引用,它的值等于你上次设置它们的值 - 8 /慕尼黑。