2015-07-21 134 views
0

嗨我想添加具有不同属性设置的同一对象。但是,当遍历列表时,它给了我最新添加的设置。将对象添加到通用列表

正如你可以看到下面是我的代码。

List<TestObject> list = new ArrayList<TestObject>(); 
TestObject t= new TestObject(); 
t.setEmail("[email protected]"); 
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()); 
} 

输出:

[email protected] 
The_lawyer99yahoo.com 
The_lawyer99yahoo.com 
The_lawyer99yahoo.com 

什么我的疑问是,为什么iteretor是给新增加了对象SETING(电子邮件),但当我EXCUTE这种说法System.out.println(list.get(0).getEmail());其做工精细

为什么for环刚不断返回最近添加的对象?

在此先感谢。

+2

你不是创建一个新对象,但只需更改内存中同一对象的属性即可。 'List'将允许你多次添加一个Object的同一个实例,所以它可以像你添加多个对象一样“看起来”,事实上,它只是指向同一个对象的一组元素。使用某种“Set”,而您会发现只有一个对象;) – MadProgrammer

+0

您有相同的对象t,所以是相同的参考,您必须在设置2封电子邮件之前制作一个新对象 – nicearma

回答

2

我猜的Java只放置到对象的引用到你的列表,以便您选择更改元素的属性会影响列表内容好。

3

你不是创建一个新的对象,而只是改变内存中的同一个对象的属性。 List将允许您多次添加同一个Object实例,因此它可以“看起来”像添加了多个对象,实际上,它只是指向同一对象的一组元素。使用某种形式的Set代替,你会发现你只有一个单一的对象;)

您将需要为每个新条目创建TestObject的新实例,例如...

List<TestObject> list = new ArrayList<TestObject>(); 
TestObject t= new TestObject(); 
t.setEmail("[email protected]"); 
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的不同实例相关联的每个条目

0

你的问题被称为别名。当您将对象t提交给容器时,它实际上对您的对象的引用感兴趣。因此,位置0处的项目和位置1处的项目完全相同,因为您在同一个对象上存储了两次相同的引用,而不是两个不同的对象。因此,当您修改t时,您实际上正在修改迄今为止创建的唯一对象,并且这两个引用将显示更新的日期。

为了解决这个问题,只需创建一个新的对象,并使用下面的行把它添加到列表(因为你已经做了第一次):

t = new TestObject();