将对象添加到通用列表
问题描述:
嗨我想添加具有不同属性设置的同一对象。但是,当遍历列表时,它给了我最新添加的设置。将对象添加到通用列表
正如你可以看到下面是我的代码。
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
环刚不断返回最近添加的对象?
在此先感谢。
答
我猜的Java只放置到对象的引用到你的列表,以便您选择更改元素的属性会影响列表内容好。
答
你不是创建一个新的对象,而只是改变内存中的同一个对象的属性。 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
的不同实例相关联的每个条目
答
你的问题被称为别名。当您将对象t
提交给容器时,它实际上对您的对象的引用感兴趣。因此,位置0处的项目和位置1处的项目完全相同,因为您在同一个对象上存储了两次相同的引用,而不是两个不同的对象。因此,当您修改t
时,您实际上正在修改迄今为止创建的唯一对象,并且这两个引用将显示更新的日期。
为了解决这个问题,只需创建一个新的对象,并使用下面的行把它添加到列表(因为你已经做了第一次):
t = new TestObject();
你不是创建一个新对象,但只需更改内存中同一对象的属性即可。 'List'将允许你多次添加一个Object的同一个实例,所以它可以像你添加多个对象一样“看起来”,事实上,它只是指向同一个对象的一组元素。使用某种“Set”,而您会发现只有一个对象;) – MadProgrammer
您有相同的对象t,所以是相同的参考,您必须在设置2封电子邮件之前制作一个新对象 – nicearma