Java 带有简单for循环的奇怪bug

Java 带有简单for循环的奇怪bug,java,for-loop,Java,For Loop,我目前正在尝试读取此XML文件(请注意,为了简单起见,我简化了XML): val9 td8 我使用JAXB库来阅读它 基本上我做了一个循环: List<DataVal> l = new ArrayList<DataVal>(); for (int i = 0; i < data.getUsers().size(); i++) { DataVal pc = new DataVal(); pc.setUser_id(data.getUsers().

我目前正在尝试读取此XML文件(请注意,为了简单起见,我简化了XML):


val9
td8
我使用JAXB库来阅读它

基本上我做了一个循环:

List<DataVal> l = new ArrayList<DataVal>();

for (int i = 0; i < data.getUsers().size(); i++) {
    DataVal pc = new DataVal();
    pc.setUser_id(data.getUsers().get(i).getId().toString());
    pc.setUser_name(data.getUsers().get(i).getName());
    pc.setUser_location(data.getUsers().get(i).getLocation());

    for (int j = 0; j < data.getUsers().get(i).getHosts().getHost().size(); j++) {
        pc.setHost_name(data.getUsers().get(i).getHosts().getHost().get(j).getHostName());
        System.out.println(pc);
        l.add(pc);
    }
}   
listl=newarraylist();
对于(int i=0;i
注意,当我在添加到列表之前执行System.out.println(pc)时,pc的值是正确的

但是当我在这段代码之后打印ArrayList“l”时,我会同时得到主机名td8,而不是下一个主机名val9和td8。但id、名称和位置值是正确的

为什么会这样

这是用于打印列表的代码:

for (int q = 0; q < l.size(); q++) {
    System.out.println(l.get(q)); // I have a toString implementation of this...
}
for(int q=0;q

编辑:在使用eclipse对此进行调试之后,由于某种原因,在每次迭代j循环之后,这些值都会更改为host_name的最后一个循环值

似乎每次都要替换pc.setHost_name,这意味着您的主机名值将等于主机的最后一次读取


如果需要区分,这意味着您需要在主机循环中创建DataVal对象,而不是用户循环。

显示打印
ArrayList
what is data.getSites()?我在你的XML中没有看到一个站点元素。对此我很抱歉,这是编辑时的一个输入错误。但从本质上讲,我仍然很困惑,为什么在double for循环中打印时该值是正确的,而在打印列表时却不正确……看起来您只是在创建一个DataVal并重复将其添加到列表中,并且每次都覆盖主机名。您可能希望将创建和填充DataVal实例的所有代码移到内部循环中。您是对的。我只是不明白为什么数据会在j循环中被覆盖。当前存储第一次迭代,但第二次添加操作会更改列表中的第一个值以及第二个值。你能说得详细一点吗?因为你使用的是同一个对象引用
for (int q = 0; q < l.size(); q++) {
    System.out.println(l.get(q)); // I have a toString implementation of this...
}