我有一个对象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
请建议。 感谢。
答案 0 :(得分:4)
假设将对象添加到列表/数组中是一个常见的错误。
如果是真的,你可以添加对集合的引用,而不是对象,它是复制的引用。
每次调用new
或clone()
时,您都会创建一个新对象。
// 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对象但具有不同的值。如果你:
您的列表中将有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的玩家。