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 / München。为什么会这样?我不明白这一点,因为当我添加第一个元素时,它包含 1 / Berlin。然后我覆盖这些值并添加第二个。

谢谢

4

7 回答 7

6

如果您不创建对象,那么..

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

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

于 2013-07-01T11:27:43.470 回答
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 bank = new Bank(); 你创建了一个新的银行对象,我们称它为 Bank@200。您将其设置为“8”并将其添加到您的列表中。你现在的清单是:

好的。现在假设您没有创建新的 Bank 对象

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

所以它包含两次相同的对象,而您恰好将这个对象修改为“8”,“Munchen”。

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

于 2013-07-01T11:43:37.203 回答
2

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

在最典型的例子中,在银行被添加到列表之后,银行变量可以被分配(即指向)其他东西。所以在第一个例子中,银行得到了别的东西。

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

于 2013-07-01T11:32:07.373 回答
1

因为 List 不是 Set 并且可以将相同的对象作为单独的元素存储两次。您在这里添加了两次相同的对象。

banks.add(bank);
...
banks.add(bank);
于 2013-07-01T11:27:59.597 回答
1

您正在修改现有的List。List允许重复,它不会阻止您将具有相同值的对象添加两次。为了防止重复,您可以执行以下操作:

myHashSet = new HashSet<Bank>(bank);

接着:

banks = new List<Bank>(myHashSet);

Set不允许重复。

于 2013-07-01T11:31:56.177 回答
0

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

于 2013-07-01T11:32:05.187 回答
0

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

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

于 2013-07-01T11:33:13.383 回答