list.add(user)的问题

本文通过一个具体的Java示例解释了为何在循环内部创建对象对于正确填充集合至关重要。当对象在循环外部创建时,所有集合元素最终指向同一个被多次修改的对象实例,导致集合中的数据不正确。

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

  1. publicstaticList<User>getUsers()
  2. {
  3. Connectionconn=DB.getConn();
  4. List<User>list=newArrayList<User>();
  5. Stringsql="select*fromuser";
  6. ResultSetrs=DB.executeQuery(conn,sql);
  7. try
  8. {
  9. while(rs.next())
  10. {
  11. Useru=newUser();//此处的语句不能放在while外面,,否则list中放的都只是最后一条的记录
  12. u.setId(rs.getInt("id"));
  13. u.setUsername(rs.getString("username"));
  14. u.setPassword(rs.getString("password"));
  15. u.setPhone(rs.getString("phone"));
  16. u.setAddr(rs.getString("addr"));
  17. u.setRDate(rs.getTimestamp("rdate"));
  18. list.add(u);
  19. }
  20. }
  21. catch(SQLExceptione)
  22. {
  23. e.printStackTrace();
  24. }
  25. finally
  26. {
  27. DB.closeRs(rs);
  28. DB.closeConn(conn);
  29. }
  30. returnlist;
  31. }



老师,为什么User u = new User(); 这句话放在循环体外,再从list中读数据时,假设数据库中有三条记录,它取出的是三条相同的记录,且都是最后一条记录呢??为什么放入到的循环体内就正常了呢???

瓣瓣(503398720) 22:07:16
放在外边的话 相当于list中只放了一个user 当然结果集的最后一条 就是封装数据的这个user
瓣瓣(503398720) 22:08:58
User u = new User(); 把它放在循环里的话 就是每次进入循环体 都会新建一个user对象 每个user封装不同的数据 就正常了
双东女青(82853546) 22:10:08
在循环体外,当然是相同的对象了
双东女青(82853546) 22:10:54
只有放在里面,才倒每走一次循环,实例化一个对象
大块头(305347899) 22:12:01
意思是说如果放在外面的话只循环一次???
大块头(305347899) 22:12:22
两位两解释一下
双东女青(82853546) 22:13:42
循环了三次,不过只实例化了一个 use对象
大块头(305347899) 22:14:34
但照我的理解,,虽然用的是同一个user但它们的内容是不一样的啊.....何况为什么list中第一条数据就是数据库中的第一条数据了
双东女青(82853546) 22:15:14
内容是不一样,每循环一次,后一次覆盖了前一次的值
双东女青(82853546) 22:15:28
所以才会返回的结果是三条一样的
大块头(305347899) 22:15:41
但它每一次都add了啊??
双东女青(82853546) 22:19:47
list.add加的是同一个对象呀
大块头(305347899) 22:20:15
你 们是说.它每一次add的时候相当于是指向了u的内容,但u的内容到结束循环的时候已经变成了最后一条的记录的内容,所以list中的每一个记录都是指向 u这个对象,而此时u的内容已经是最后一条记录的内容了,所以list中的每一条数据的内容都是最后一条记录中的内容,,是这样的意思吗?
双东女青(82853546) 22:20:23
对象的值由于变化而造成list中的记录是一样的,是同一对象
双东女青(82853546) 22:20:59
是的
双东女青(82853546) 22:21:09
因为这个list中同一个对象
双东女青(82853546) 22:21:39
对象由于循环而改变成了最后一条记录的值,所以就是这样子了
双东女青(82853546) 22:22:18
在循环体内的话,就是每次循环都生成了一个新的对象。
大块头(305347899) 22:22:34
原来如此
双东女青(82853546) 22:22:40
list中加入的就是三个对象了噻。。
大块头(305347899) 22:23:21
谢谢了


相当于加入的是同一个人,虽然它的衣服每循环一次,就变一次,并且list中都增加一个人,但因为是同一个人,它们的值都是一样的,所以到最后是最后一条的记录,且每一个都是相同的内容
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值