项目场景:
关于循环结构调用Java结构体类进行List.add(),结果全部相同的问题。
问题描述:
List<RspUserStation> list = new ArrayList<>();
RspUserStation rspUserStation = new RspUserStation(); //自定义的结构体
for(int i=1;i<=10;i++){//假装有循环
rspUserStation.setStaffId(i);
list.add(rspUserStation);
System.out.println(rspUserStation);
}
以下代码会将list中数据全覆盖输出成10,但是println会正常输出1~10.
例如
[
{
setStaffId="10";
},
{
setStaffId="10";
},
...//省略七个葫芦娃
{
setStaffId="10";
}
]
原因分析:
list<基础类型> 与 list<自定义类对象> 中的add()方法会有区别。
前者是和预想的一样,就是给集合按顺序添加元素,而后者在添加的时候会覆盖前面的元素。
每一次遍历,list中的内容都会被新的cat覆盖
查询资料发现,转递给add()方法的是自定义类的引用,是一个内存地址,所以定义在外部for循环外部的对象的引用,在for循环的时候没有改变内存地址,所以添加到list的是同一个对象的地址,所以每次add都会覆盖掉前面的内容。
解决方案:
如果想不覆盖的话,把声明函数写在for循环内部即可,这样每次循环都会重新在内存中开辟一段空间。
List<RspUserStation> list = new ArrayList<>();
for(int i=1;i<=10;i++){//假装有循环
RspUserStation rspUserStation = new RspUserStation(); //自定义的结构体移动到这里
rspUserStation.setStaffId(i);
list.add(rspUserStation);
System.out.println(rspUserStation);
}