Java ArrayList仅显示索引的最后一个值
预期产出为: 约翰 约瑟 标记 但我得到的是: 做记号 做记号 标记Java ArrayList仅显示索引的最后一个值,java,Java,预期产出为: 约翰 约瑟 标记 但我得到的是: 做记号 做记号 标记 有人能帮我找到代码的错误吗???我想你需要更改下面的逻辑 public static void main(String args[]) { EmployeeInfoPojo emip = null; EmployeeInfo emi = new EmployeeInfo(); ArrayList info = emi.getEmpInfo(102); Iterator it = info.
有人能帮我找到代码的错误吗???我想你需要更改下面的逻辑
public static void main(String args[]) {
EmployeeInfoPojo emip = null;
EmployeeInfo emi = new EmployeeInfo();
ArrayList info = emi.getEmpInfo(102);
Iterator it = info.iterator();
while (it.hasNext()) {
emip = (EmployeeInfoPojo) it.next();
System.out.println(emip.getName());
}
}
到
因为在将同一对象添加到ArrayList时,它将采用上次更新的值。简单地说,您需要在while循环中创建一个新的EmployeeInfoPojo对象。否则,您所要做的就是一次又一次地更改单个对象的属性。您的“emp\u info”变量是在循环外部创建的,这意味着循环内部的变量始终是同一个实例。当您将该实例放入列表中时,它仍然是同一个实例。(向列表中添加内容会添加该实例,而不是副本。) 移动此行:
while (it.hasNext()) {
lp = (loginPojo) it.next();
emp_info = new EmployeeInfoPojo();//create object here
emp_info.setName(lp.getName());
System.out.println("Before "+emp_info.getName());
data.add(emp_info);
System.out.println("After "+emp_info.getName());
}
EmployeeInfoPojo emp_info = new EmployeeInfoPojo();
紧跟在这一行之后:
while (it.hasNext()) {
lp = (loginPojo) it.next();
emp_info = new EmployeeInfoPojo();//create object here
emp_info.setName(lp.getName());
System.out.println("Before "+emp_info.getName());
data.add(emp_info);
System.out.println("After "+emp_info.getName());
}
EmployeeInfoPojo emp_info = new EmployeeInfoPojo();
您应该会发现循环的行为更像您期望的那样。您只需在方法getEmployeeInfo中创建EmployeeInfoPojo的单个对象。每次迭代列表时都需要初始化ep_信息。 迭代器代码应该如下所示-
lp = (loginPojo) it.next();
在以前的代码中,您只对单个对象进行操作,这就是为什么当您更改此对象时,旧值将覆盖和ArrayList,并在每次循环时添加相同的对象。
因此,所有对象中只反映最后一个值(单个对象有三个引用)。public ArrayList getEmpInfo(int-id){
ArrayList数据=新的ArrayList();
loginPojo lp=新的loginPojo();
会话=空;
SessionFactory SessionFactory=新配置().configure().buildSessionFactory();
session=sessionfactory.openSession();
字符串sql_query=“from loginPojo,其中id!=”+id;
Query=session.createQuery(sql\U查询);
List=query.List();
Iterator it=list.Iterator();
while(it.hasNext()){
//您需要创建新对象,否则它将使用相同的对象引用
EmployeeInfoPojo emp_info=新员工InfoPojo();
lp=(loginPojo)it.next();
emp_info.setName(lp.getName());`在这里输入代码`
System.out.println(“Before”+emp_info.getName());
添加数据(emp_信息);
System.out.println(“在”+emp_info.getName()之后);
}
返回数据;
}
请补充一点说明,说明您解决了什么问题/出现问题的原因。我们面临着同样的问题。非常感谢。你的代码片段非常清晰!!
while (it.hasNext()) {
lp = (loginPojo) it.next();
emp_info = new EmployeeInfoPojo
emp_info.setName(lp.getName());
System.out.println("Before "+emp_info.getName());
data.add(emp_info);
System.out.println("After "+emp_info.getName());
}
public ArrayList getEmpInfo(int id) {
ArrayList data = new ArrayList();
loginPojo lp=new loginPojo();
Session session = null;
SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory();
session = sessionfactory.openSession();
String sql_query = "from loginPojo where id!=" + id;
Query query = session.createQuery(sql_query);
List<loginPojo> list = query.list();
Iterator it = list.iterator();
while (it.hasNext()) {
//you need to create new object or else it uses same object reference
EmployeeInfoPojo emp_info = new EmployeeInfoPojo();
lp = (loginPojo) it.next();
emp_info.setName(lp.getName());`enter code here`
System.out.println("Before "+emp_info.getName());
data.add(emp_info);
System.out.println("After "+emp_info.getName());
}
return data;
}