2

次のコードがあります。ここで、usersという名前のList<>オブジェクトを作成します。ユーザーオブジェクトを別のList<>に設定しました。しかし、usersオブジェクトに何かを追加するとすぐに、他の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 <>のサイズは大きくなりません(もちろん、ユーザーオブジェクトも同様です)。

4

3 に答える 3

6

users = game.getUserProfile().getProfileFriends();
リストではなく、リストへの参照をコピーします。
のコンストラクタを使用ArrayListして、浅いコピーを作成します。

于 2012-07-11T19:49:20.333 に答える
2

Javaでは、実際のオブジェクト自体ではなく、オブジェクトへの参照を処理します。

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

この行は、元のリストからユーザーにコンテンツをコピーするのではなく、users変数がgame.getUserProfile()。getProfileFriends()と同じリストを指すようにします。したがって、usersとgame.getUserProfile()。getProfileFriends()はどちらもメモリ内の同じリストを参照しているため、2つの別々のリストはありません。

Javaが文字通りオブジェクト全体を常に割り当てて渡した場合、非効率的で高価なものがどのように得られるかを考えてみてください。

現在のリストの内容を新しいリストにコピーするには、コレクションを取得してそのアイテムを新しいリストにコピーするコンストラクターを使用するだけです。

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

あなたの中で

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

ユーザーとゲームフィールドは、単純なコピーを行うことで同じ参照になります。したがって、変更は相互に反映されます。

于 2012-07-11T19:49:00.333 に答える