向集合(List、Set、Map)中添加若干对象,最后输出若干最后一个添加的对象问题
先看一个程度demo,找出问题。
public class Information {
private int id ;
private String name ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Information [id=" + id + ", name=" + name + "]";
}
}
public class Test {
public static void main(String[] args) {
List<Information> list = new ArrayList<Information>();
Information information = new Information();
for(int i = 0 ; i <4 ; i ++){
information.setId(i);
information.setName(i+"");
list.add(information);
}
Iterator<Information> iterator = list.iterator();
while(iterator.hasNext()){
Information information2 = iterator.next();
System.out.println(information2.toString());
}
}
}
先思考下使用迭代器输出有什么问题?(我空出一大段贴出答案)
输出结果:
Information [id=3, name=3]
Information [id=3, name=3]
Information [id=3, name=3]
Information [id=3, name=3]
问题出在哪里?
说明下对象引用问题:
Information information = new Information();
list.add(information);
在上面的代码块中使用这种new方式初始化一个类对象放到list中本身没有问题,但是,这种list中放入的“information”只是放入了对象的引用,而且每次都是放入这同一个引用。虽然每次循环都是设置更改了information对象的属性,所以从头到尾的循环中都是引用这一个information对象。
更改方式:
在new Information()写在for循环中,每次循环都有一个新对象产生。
public class Test {
public static void main(String[] args) {
List<Information> list = new ArrayList<Information>();
for(int i = 0 ; i <4 ; i ++){
Information information = new Information();
information.setId(i);
information.setName(i+"");
list.add(information);
}
Iterator<Information> iterator = list.iterator();
while(iterator.hasNext()){
Information information2 = iterator.next();
System.out.println(information2.toString());
}
}
}
此时代码运行效果如下:
Information [id=0, name=0]
Information [id=1, name=1]
Information [id=2, name=2]
Information [id=3, name=3]