关于循环结构调用Java结构体类进行List.add(),结果全部相同的问题。

项目场景:

关于循环结构调用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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值