您好我正在尝试使用不同的属性设置添加相同的对象。但是当通过列表迭代时,它给了我最新添加的设置。
如下所示,我的代码是
List<TestObject> list = new ArrayList<TestObject>();
TestObject t= new TestObject();
t.setEmail("John1989@gmail.com");
list.add(t);
System.out.println(list.get(0).getEmail());
t.setEmail("The_lawyer99yahoo.com");
list.add(t);
System.out.println(list.get(1).getEmail());
for(TestObject s : list)
{
System.out.println(s.getEmail());
}
输出:
John1989@gmail.com
The_lawyer99yahoo.com
The_lawyer99yahoo.com
The_lawyer99yahoo.com
我怀疑为什么iteretor会提供最新添加的对象设置(电子邮件)但是当我执行此语句时System.out.println(list.get(0).getEmail());
其工作正常
为什么for
循环只是随着最近添加的对象一起返回?
提前致谢。
答案 0 :(得分:3)
您不是在创建新对象,而只是在内存中更改同一对象的属性。 List
允许您多次添加Object
的同一个实例,因此它可以&#34;外观&#34;就像你实际上添加了多个对象一样,它只是指向同一个对象的一堆元素。使用某种Set
而你会发现你只有一个对象;)
您需要为每个新条目创建TestObject
的新实例,例如......
List<TestObject> list = new ArrayList<TestObject>();
TestObject t= new TestObject();
t.setEmail("John1989@gmail.com");
list.add(t);
System.out.println(list.get(0).getEmail());
t= new TestObject();
t.setEmail("The_lawyer99yahoo.com");
list.add(t);
System.out.println(list.get(1).getEmail());
for(TestObject s : list)
{
System.out.println(s.getEmail());
}
这样,属性与每个条目的TestObject
的不同实例相关联
答案 1 :(得分:2)
我猜Java只会将对象的引用放入列表中,因此当您更改元素的属性时,它也会影响列表内容。
答案 2 :(得分:0)
您的问题称为别名。当您将对象t
提交到容器时,它实际上对您的对象的引用感兴趣。因此,位置0处的项目和位置1处的项目完全相同,因为您在同一对象上存储了相同的引用两次而不是两个不同的对象。因此,当您修改t
时,您实际上正在修改到目前为止创建的唯一对象,并且两个引用都将显示更新日期。
要解决此问题,只需创建一个新对象,然后使用以下行将其添加到列表中(如第一次那样):
t = new TestObject();