Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList仅显示索引的最后一个值_Java - Fatal编程技术网

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;
        }