list.add(user)的问题

  1.  public static List<User> getUsers()
  2.     {
  3.         Connection conn = DB.getConn ( );
  4.         List<User> list = new ArrayList<User>();
  5.         String sql = "select * from user";
  6.         ResultSet rs =DB.executeQuery ( conn , sql );
  7.         try
  8.         {
  9.             while(rs.next ( ))
  10.             {
  11.                 User u = new User();                   //此处的语句不能放在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 ( SQLException e )
  22.         {
  23.             e.printStackTrace();
  24.         }
  25.         finally
  26.         {
  27.             DB.closeRs ( rs );
  28.             DB.closeConn ( conn );
  29.         }
  30.         return list ;
  31.         
  32.     }



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

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


相当于加入的是同一个人,虽然它的衣服每循环一次,就变一次,并且list中都增加一个人,但因为是同一个人,它们的值都是一样的,所以到最后是最后一条的记录,且每一个都是相同的内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值