ArrayList仅显示索引的最后一个值

时间:2012-03-20 05:38:34

标签: java

public ArrayList getEmpInfo(int id) {

        ArrayList data = new ArrayList();
        loginPojo lp=new loginPojo();
        EmployeeInfoPojo emp_info = new EmployeeInfoPojo();

        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()) {
            lp = (loginPojo) it.next();
            emp_info.setName(lp.getName());

            System.out.println("Before "+emp_info.getName());
            data.add(emp_info);
            System.out.println("After "+emp_info.getName());
        }
        return data;
    }

这是使用hibernate框架从数据库获取信息的代码。我尝试使用以下代码在main中显示ArrayList。

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

预期输出为: 约翰 何塞 标记

但是得到的是: 标记 标记 标记

任何人都可以找到我的代码????

5 个答案:

答案 0 :(得分:2)

我认为您需要更改以下逻辑...

 while (it.hasNext()) {
        lp = (loginPojo) it.next();
        emp_info.setName(lp.getName());


        System.out.println("Before "+emp_info.getName());
        data.add(emp_info);
        System.out.println("After "+emp_info.getName());
    }

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

因为,当您将相同的对象添加到ArrayList时,它会获取您上次更新的值。

答案 1 :(得分:0)

简而言之,您需要在while循环中创建一个新的EmployeeInfoPojo对象。否则,您所做的就是反复更改单个对象的属性。

答案 2 :(得分:0)

您的“emp_info”变量正在循环外创建,这意味着循环内的变量始终是同一个实例。当您将该实例放入列表时,它仍然是相同的实例。 (向列表添加内容会添加 实例,而不是副本。)

移动此行:

EmployeeInfoPojo emp_info = new EmployeeInfoPojo();
紧接在这一行之后

lp = (loginPojo) it.next();

你会发现你的循环行为更像你期望的那样。

答案 3 :(得分:0)

您只需在方法getEmployeeInfo中创建EmployeeInfoPojo的单个对象。每次迭代列表时都需要初始化ep_info。 迭代器代码应如下所示 -

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

在之前的代码中,您只对单个对象进行操作,这就是为什么当您更改此对象时,旧值将覆盖并且ArrayList每次循环时都会添加相同的对象。 因此,只有最后一个值反映在所有对象中(具有三个引用的单个对象)。

答案 4 :(得分:0)

std::mem::swap