2013-07-01 58 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构造为银行定义和工作正常。

相关问题