常被错用的 ArrayList add 方法

JSP 做棵大树 6年前 (2017-12-21) 2735次浏览 0个评论

今天在做项目的时候,用了 ArrayList 数组,然后发现 ArrayList 的内容居然一样。原来 Add 方法不恰当使用会覆盖前一个内容的值。在这里记录一下。

错误的做法 ##

             ArrayList alist = new ArrayList();
             Software software = new Software();  
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			//读取信息并存入 software 对象数组
			while (rs.next()) {
				
				software.setSimage(rs.getString("simage"));
				software.setSname(rs.getString("sname"));
				software.setSsize(rs.getInt("ssize"));
				software.setSdesc(rs.getString("sdesc"));
				software.setSdate(rs.getDate("sdate"));
				software.setSoftware(rs.getString("software"));
				alist.add(software);
			}
			return alist;

以上做法循环了之后发现 ArrayList 的内容一样。因为新加入的 software 会覆盖上一个 software,不希望这样的话,必须把实例化的过程Software software = new Software(); 放进 f 循环中去。

正确的做法 ##

ArrayList alist = new ArrayList();
		
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			//读取信息并存入 software 对象数组
			while (rs.next()) {
				Software software = new Software();  //防止 ArrayList 的 add 方法产生覆盖
				software.setSimage(rs.getString("simage"));
				software.setSname(rs.getString("sname"));
				software.setSsize(rs.getInt("ssize"));
				software.setSdesc(rs.getString("sdesc"));
				software.setSdate(rs.getDate("sdate"));
				software.setSoftware(rs.getString("software"));
				alist.add(software);
			}
			return alist;

原因:
其实 add 加进去的是对象的一个引用,对象实例化放在循环外面,你每次都更新了这个引用的值,当然 list 里面的值都一样的。如果把(Software software = new Software(); //防止 ArrayList 的 add 方法产生覆盖)放到循环里面,每次都生成一个新的对象,更改自身不会对其他元素有影响....


做棵大树 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明常被错用的 ArrayList add 方法
喜欢 (1)
[欢迎投币]
分享 (0)
关于作者:
一个整天无所事事的,有时候忽然热血的孩子
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址