- public static List<User> getUsers()
- {
- Connection conn = DB.getConn ( );
- List<User> list = new ArrayList<User>();
- String sql = "select * from user";
- ResultSet rs =DB.executeQuery ( conn , sql );
- try
- {
- while(rs.next ( ))
- {
- User u = new User(); //此处的语句不能放在while外面,,否则list中放的都只是最后一条的记录
- u.setId ( rs.getInt ( "id" ) );
- u.setUsername ( rs.getString ( "username" ) );
- u.setPassword ( rs.getString ( "password" ) );
- u.setPhone ( rs.getString ( "phone" ) );
- u.setAddr ( rs.getString ( "addr" ) );
- u.setRDate ( rs.getTimestamp ( "rdate" ) );
- list.add ( u );
- }
- }
- catch ( SQLException e )
- {
- e.printStackTrace();
- }
- finally
- {
- DB.closeRs ( rs );
- DB.closeConn ( conn );
- }
- return list ;
- }
老师,为什么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中都增加一个人,但因为是同一个人,它们的值都是一样的,所以到最后是最后一条的记录,且每一个都是相同的内容