如何防止java中arraylIst中的对象复制

时间:2012-03-15 10:22:35

标签: java arraylist clone

我有一个对象Player的arrayList。玩家有字段ID,并得分。假设当我添加player object with id:1, score:200时,arrayList有player with id:1 and score :300,arraylist现在有两个对象,但两者都得分为200.而它应该是一个得分为100而一个得分。 我尝试将clone()方法作为arrayList.add(player.clone()),但它没有解决我的问题。

Player player= playerService.getPlayerById(id);
player.SetScore(100);
challenge.getPlayerList().add(player.clone());
here challenge is an object which has an attribute playerlist

请建议。 感谢。

4 个答案:

答案 0 :(得分:4)

假设将对象添加到列表/数组中是一个常见的错误。

如果是真的,你可以添加对集合的引用,而不是对象,它是复制的引用

每次调用newclone()时,您都会创建一个新对象。

// Don't do this
Player p = new Player(1, 100);
list.add(p);
list.add(p); // adds a reference to the same object.

// Do this
list.add(new Player(1, 100));
list.add(new Player(2, 200));

答案 1 :(得分:1)

如果向列表添加两个Player实例,则列表将包含两个项目,即使这两个实例是同一个对象。

如果您看到第二个实例的值错误,那么您可以

  • 添加了错误的对象或
  • 查看了错误的地方/索引(在列表中)

答案 2 :(得分:0)

如果没有您显示某些代码,我猜测您正在添加相同的Player对象但具有不同的值。如果你:

  • 添加ID为1且得分为100
  • 的玩家
  • 将该玩家对象的值更改为得分:200
  • 再次添加该对象

您的列表中将有2个玩家,其中包含玩家对象的最后一个值。

在某处您需要使用新值执行new Player(),而不仅仅是重复使用相同的Player对象。

阅读这篇文章,了解有关按引用的调用,按值调用:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

答案 3 :(得分:0)

此:

Player player= playerService.getPlayerById(id);
player.SetScore(100);
challenge.getPlayerList().add(player.clone());

正如您所知,在列表中添加了两个重复的项目。如果我正在读你的问题,你真的想做一些像:

Player player= playerService.getPlayerById(id);
Player clone = (Player)player.clone();
clone.SetScore(100);
challenge.getPlayerList().add(clone);

这仅设置 new 播放器的得分,而不是两者的得分。所以现在你将有一个列表,其中包含一个具有原始分数的玩家和一个得分为100的玩家。