我想了解为什么会发生以下情况:
数据类型库
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 /柏林。然后我覆盖值并添加第二个。
由于
答案 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 /慕尼黑。