我有一个名为Technician的课程
public class Technician {
private String empLName;
private String empFName;
private int empId;
//I skipped all setters and getters
}
在其他课程中,我会检索所有技术人员名称并将其加载到数组列表中。
Technician empl = new Technician();
ArrayList <Technician> employees = new ArrayList<Technician>();
//...skip code related to database
// rs is ResultSet
while (rs.next()){
empl.setEmpFName(rs.getString("EMP_LNAME"));
empl.setEmpLName(rs.getString("EMP_FNAME"));
empl.setEmpId(rs.getInt("EMP_ID"));
employees.add(empl);
}
当我调试时,我看到从数据库中检索到正确的值。 在while循环的第一次迭代中,我的empl对象获得值 数据库中的第一个雇员,它存储在雇员ArrayList中。 在第二次迭代中,雇员ArrayList中的第一个对象被第二个雇员的值覆盖。因此,我的ArrayList中有两名员工,姓氏相同。 在第三次迭代中,同样的故事,员工ArrayList中的两名员工被覆盖 数据库中第三名员工的价值。
如果有任何建议如何修复我的代码,我将不胜感激。 谢谢,
答案 0 :(得分:11)
您需要在while循环中重新实例化empl。
您的代码存在的问题是empl是一种引用类型。它指向一块内存。设置empl属性的值时,它只是覆盖存储在该内存块中的值,而不是创建新内存来保存不同的值。 ArrayList只是持有N个单元,引用由empl引用的同一块内存。
修正:
while (rs.next()){
Technician empl = new Technician();
empl.setEmpFName(rs.getString("EMP_LNAME"));
empl.setEmpLName(rs.getString("EMP_FNAME"));
empl.setEmpId(rs.getInt("EMP_ID"));
employees.add(empl);
}
答案 1 :(得分:2)
您不断更改并将相同的实例添加到列表中。您需要在每个循环中创建一个新实例。
while (rs.next()) {
empl = new Technician();
empl.setEmpFName(rs.getString("EMP_LNAME"));
empl.setEmpLName(rs.getString("EMP_FNAME"));
empl.setEmpId(rs.getInt("EMP_ID"));
employees.add(empl);
}
答案 2 :(得分:2)
您每次都将SAME empl放入员工,然后更改每行的empl值。这样做:
ArrayList <Technician> employees = new ArrayList<Technician>();
//...skip code related to database
// rs is ResultSet
while (rs.next()){
Technician empl = new Technician();
empl.setEmpFName(rs.getString("EMP_LNAME"));
empl.setEmpLName(rs.getString("EMP_FNAME"));
empl.setEmpId(rs.getInt("EMP_ID"));
employees.add(empl);
}
答案 3 :(得分:2)
之所以发生这种情况,是因为每次循环遍历数组时,empl都是相同的引用。相反,您必须初始化一个新的empl对象。
Technician empl = new Technician();
ArrayList <Technician> employees = new ArrayList<Technician>();
//...skip code related to database
// rs is ResultSet
while (rs.next()){
empl = new Technician();
empl.setEmpFName(rs.getString("EMP_LNAME"));
empl.setEmpLName(rs.getString("EMP_FNAME"));
empl.setEmpId(rs.getInt("EMP_ID"));
employees.add(empl);
}