ArrayList add方法正在覆盖列表中的对象

时间:2016-01-19 20:02:45

标签: java arrays arraylist collections

因此,当我尝试将一个Trick添加到ArrayList时,添加的Trick会覆盖ArrayList中已有的内容,以便ArrayList中的所有元素都包含我刚刚添加的技巧。

这些方法在我的主要课程中:

public Trick playTrick(Player firstPlayer){
     Trick t=new Trick(firstPlayer.getID());
        return t;

}


public void playGame(){

    for(int i=0;i<NOS_TRICKS;i++){

        Trick t=playTrick(players[firstPlayer]);
        players[firstPlayer].update(t);
        //System.out.println(t.completedTricks);
    }

}

当调用播放器[firstPlayer] .update(t)时发生错误,update(t)将Trick t添加到我的ArrayList:

public class BPlayer implents Player{
   public void update(Trick t){
       this.strategy.updateData(t);
   }
}

然后触发updateData:

public class AdvStrategy implements Strategy{
    public static ArrayList<Trick> completedTricks = new ArrayList<>();

    @Override
    public void updateData(Trick c) {
        completedTricks.add(c);
    }
}

打印ArrayList时的输出示例:

Trick ={3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}
Lead =3 Winner =3 DIAMONDS
ARRAYLIST[{3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}]
Trick ={3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}
Lead =3 Winner =3 DIAMONDS
ARRAYLIST[{3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}, {3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}]

工作时的最后一行输出应为......

ARRAYLIST[{3=KING DIAMONDS, 0=TWO DIAMONDS, 1=THREE DIAMONDS, 2=FIVE DIAMONDS}, {3=QUEEN DIAMONDS, 0=FOUR DIAMONDS, 1=SIX DIAMONDS, 2=TEN DIAMONDS}]

1 个答案:

答案 0 :(得分:1)

当您编写Trick t这是一个引用到Trick时,当您将此引用添加到ArrayList时,引用被复制而不是对象它引用。这意味着如果您多次向List添加相同的引用并更改它引用的对象,则看起来所有对象在实际只有一个之前已经更改。

在代码中的某个位置,您不止一次添加相同的引用。我建议您在调试器中逐步执行代码,以确切了解这种情况发生的位置。

或者你可以检查你要添加的Trick是否已经在列表中,如果是,则抛出错误。