List 中存储的对象数据,都是最后存入的值

探讨了在Java中使用List存储对象时,由于对象引用的特性导致的元素覆盖问题。详细解析了错误代码示例,并提供了正确的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

List<People> peopleList = new ArrayList();
People people = new People();
for(int i = 0 ; i < 10 ; i++){
    people.setId("id" + i);
    people.setAge("age" + i);
    peopleList.add(people);
}
//输出结果都是 
//id10
//age10
sout(peopleList);

原因

问题的产生在于,对象。对象中保存的都是地址
People 对象在循环前,便新建成功,分配了内存空间,不再发生变化。
每次赋值的过程,都是在同一个内存空间,更改保存的地址。

在这里插入图片描述

peopleList.add(people);
//其中,List 中保存的是,people 这个对象。

//在循环赋值的过程中,people 中的保存的值(所指向的地址)一直在发生变化。
for(int i = 0 ; i < 10 ; i++){
    people.setId("id" + i);
    people.setAge("age" + i);
}

所以最后存入 List 中的对象,都是最后输入的属性

正确的做法

List<People> peopleList = new ArrayList();

for(int i = 0 ; i < 10 ; i++){
    //将对象的定义放在循环里,每次都是一个新的对象
    People people = new People();
    people.setId("id" + i);
    people.setAge("age" + i);
    peopleList.add(people);
}
sout(peopleList);

此时,每次循环都会新建一个对象,分配一个新的内存空间

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值