ArrayList对象引用的问题


老问题了,之所以贴出来是给大家看看,希望不要出现类似的错误:
Java代码   收藏代码
    this.item=new ArrayList();   
       books = new Books();   
       ResultSet rs = new DBoperate().getResultSet("select * from tblbooks");   
       int i=0;   
       while (rs.next()) {   
       books.setBm(rs.getString("bm"));   
       books.setMc(rs.getString("mc"));   
       books.setAuthor(rs.getString("author"));   
       books.setPublisher(rs.getString("publisher"));   
       books.setPubdate(rs.getString("pubdate"));   
       books.setIsbn(rs.getString("isbn"));   
       books.setPrice(rs.getString("price"));   
       books.setLxbm(rs.getString("lxbm"));   
       books.setYm(rs.getString("ym"));   
       books.setPicpath(rs.getString("picpath"));   
       books.setContent(rs.getString("content"));   
       this.item.add(books);   
       }   
 
  上面的代码导致ArrayList里面都是同样的值,而且是数据库返回的最后一条记录的值;
  曾经一个朋友遇到这样的问题,那我们来分析一下:
  books在循环外部定义,那么在循环里面每次都同一个books,循环体对其进行赋值,然后将books的引用放入ArrayList里面;每次循环都在不停的改变其引用的值,那么ArrayList里面也会跟着改变其指引的books的值,那么最后停止循环的时候,ArrayList每个books的值都会被改变成最后一个值;
   所以也就不难理解,为啥都是一样的值,并且是最后一个。

或者说这么来解释:

只定义了一个books对象,循环都是在不停的改变其值,并且放入ArrayList里面的对象都是同一个,比如循环了20次,那么也就是加入了20个一模一样的books对象;当books的值最后一次被改变的时候,ArrayList里面由于都是同一个books对象,随之也会全部会改变成最后一次的值。

<不知道原帖地址,请见谅>


转载这篇文章的缘由是我下面一段代码,总是出现同样的问题...但是我没有犯上面的错误,却依然出现了相同的问题.

public ArrayList<Suser> findAll(String keyword) throws Exception {
		ArrayList<Suser> al=new ArrayList<Suser>();
		ps=conn.prepareStatement("select userid,name,password from suser where userid LIKE ? OR name LIKE ?");
		ps.setString(1,"%"+keyword+"%");
		ps.setString(2,"%"+keyword+"%");
		rs=ps.executeQuery();
		while(rs.next()) {
		//	al.add(new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password")));
			
		//	Suser sus=new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password"));
		//	System.out.println(sus.toString());
			al.add(new Suser(rs.getString("userid"),rs.getString("name"),rs.getString("password"))); 
		//	System.out.println(al);
		}
		rs.close();
		ps.close();
		conn.close();
		return al;
	}

用了多种方法,可是最后拿出的ArrayList中的值却都是一样的...十分诡异.


转载于:https://www.cnblogs.com/jackhub/archive/2012/08/23/3147230.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值