我有以下代码,我在其中创建了一个List<>对象称为用户。我将users对象设置为另一个List<>。然而,只要我向用户对象添加内容,另一个List<>对象的大小也会发生变化?这巫术是什么?这应该是这样的,我以为我只是制作了另一个List的副本<>对象
当我运行此代码时,此日志显示: 朋友数量:0 朋友数量:1 朋友数量:1
users = new ArrayList<Profile>(); // Friends of this player
users = game.getUserProfile().getProfileFriends();
game.getGameLog().d(classTAG, "Amount of Friends: " + game.getUserProfile().getProfileFriends().size());
users.add(game.getUserProfile());
game.getGameLog().d(classTAG, "Amount of Friends: " + game.getUserProfile().getProfileFriends().size());
this.sortUsersAccordingToXP();
game.getGameLog().d(classTAG, "Amount of Friends: " + game.getUserProfile().getProfileFriends().size());
注意:这不是所有代码,但代码会影响我的问题,只要我删除add方法,其他List&lt;&gt;不会增大(当然用户对象也是如此)。
答案 0 :(得分:6)
users = game.getUserProfile().getProfileFriends();
复制对列表的引用 - 而不是列表!
使用ArrayList
的构造函数创建浅表副本。
答案 1 :(得分:2)
在Java中,您处理的是对象的引用,而不是实际的对象本身。
users = game.getUserProfile().getProfileFriends();
该行不是将原始列表中的内容复制到用户中,而是使用户变量指向与game.getUserProfile()。getProfileFriends()相同的列表。所以现在用户和game.getUserProfile()。getProfileFriends()都引用了内存中的相同列表,所以你没有像你想象的那样有两个单独的列表。
想想如果Java一直被分配并传递给整个对象,那么效率和昂贵的东西会是多么低效。
要将当前列表的内容复制到新列表中,只需使用带有Collection的构造函数并将其项目复制到新列表中:
users = new ArrayList<Profile>(game.getUserProfile().getProfileFriends());
答案 2 :(得分:0)
在你的
`users = game.getUserProfile().getProfileFriends();`
通过进行简单的复制,用户和游戏领域具有相同的参考。因此,变化会相互反映。