今天在做项目的时候,用了 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 方法产生覆盖)放到循环里面,每次都生成一个新的对象,更改自身不会对其他元素有影响....