2

我有以下代码,我在其中创建了一个名为 users 的 List<> 对象。我将用户对象设置为不同的 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<> 的大小就不会增长(当然还有 users 对象)。

4

3 回答 3

6

users = game.getUserProfile().getProfileFriends();
复制对列表的引用 - 而不是列表!
使用构造函数ArrayList来创建一个浅拷贝。

于 2012-07-11T19:49:20.333 回答
2

在 Java 中,您处理的是对对象的引用,而不是实际的对象本身。

users = game.getUserProfile().getProfileFriends();

该行不是将原始列表中的内容复制到用户中,而是使用户变量指向与 game.getUserProfile().getProfileFriends() 相同的列表。所以现在 users 和 game.getUserProfile().getProfileFriends() 都引用内存中的同一个列表,所以你没有你想的两个单独的列表。

想想如果 Java 一直在分配和传递整个对象,事情会变得多么低效和昂贵。

要将当前列表的内容复制到新列表中,您只需使用构造函数,该构造函数接受一个 Collection 并将其项目复制到新列表中:

users = new ArrayList<Profile>(game.getUserProfile().getProfileFriends()); 
于 2012-07-11T19:50:27.557 回答
0

在你的

`users = game.getUserProfile().getProfileFriends();`

通过简单的复制,用户和游戏领域具有相同的参考意义。因此,变化是相互反映的。

于 2012-07-11T19:49:00.333 回答