将对象添加到通用列表

时间:2015-07-21 05:45:35

标签: java list generics

您好我正在尝试使用不同的属性设置添加相同的对象。但是当通过列表迭代时,它给了我最新添加的设置。

如下所示,我的代码是

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循环只是随着最近添加的对象一起返回?

提前致谢。

3 个答案:

答案 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();