列表与LT;>复制后的对象更改

时间:2012-07-11 19:46:18

标签: java android list

我有以下代码,我在其中创建了一个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;不会增大(当然用户对象也是如此)。

3 个答案:

答案 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();`
通过进行简单的复制,用户和游戏领域具有相同的参考。因此,变化会相互反映。