每当我向arraylist添加一些东西时,所有先前的元素都被新元素替换,发生了什么?

时间:2016-02-27 20:08:28

标签: java loops arraylist

我调试了代码,并发现每次向ArrayList添加新元素时,所有先前的元素都会被新元素替换。此类或关联的类中没有静态字段或方法。我能做错什么?提前谢谢!

**更新** GameState gs的字段,一切都是正确的,这就是我想要的。但每次添加到childrenList时,所有以前的元素都会替换为当前元素。

例如 -

1st iteration - gs = 1
[1]
2nd iteration - gs = 2
[2, 2]
3rd iteration - gs = 3
[3, 3, 3] 

what I want is [1, 2, 3]

我的代码看起来像这样......

public List getChildren(){

ArrayList<GameStateChild> childrenList = new ArrayList<GameStateChild>();

List<Map<Integer, Action>> act = getActionPairs();
for (Map<Integer, Action> action : act) {
    GameState gs = executeAction(action);
    childrenList.add(new GameStateChild(action, gs));
}

return childrenList;

}

2 个答案:

答案 0 :(得分:1)

以下是可能发生的事情:您的游戏状态对象都是指同一个游戏状态对象。更改其中一个的值会改变所有这些值。

换句话说,你的代码深处的某个地方可能会发生与此类似的事情:

GameState gs1 = returnsAGameState();
GameState gs2 = gs1;
changeThisGameState(gs2);

在此代码中,gs1gs2指的是计算机中完全相同的位置。因此,对gs2的任何更改也都会更改为gs1

您发布的代码似乎没有任何问题。我猜这个问题来自对executeAction(gs)方法的调用 - 试试看那里。

答案 1 :(得分:0)

检查GameState中的gs变量是否为非静态。

我想知道这是否真的发生了。 ArrayList的add方法仅适用于addreses,并且每次都插入新对象,因此除非您手动更改它们,否则它不应该覆盖以前的对象。