2017-11-08 8 views
1
java.util.List<java.util.List<String>> statuses = new java.util.ArrayList<>(); 
java.util.List<String> temp = new java.util.ArrayList<>(); 

System.out.println("yoi :" + temp.size()); 
statuses.add(temp); 
System.out.println("warui :" + statuses.get(0).size()); 
temp.clear(); 
System.out.println("kirai :" + statuses.get(0).size()); 

コンソール出力を空becames:一覧は

yoi :31 
warui :31 
kirai :0 

私は、私が使用する一時リストをクリアしたときに、地球リスト上の他のリスト内の空のbecamesなぜそれを挿入するには?

答えて

5

あなたはstatusestempが参照する同じListへの参照を保持していることを意味する、あなたのstatusesListListへの参照を追加しています。

あなたはListに追加する前にtempのコピーを作成する必要があります。

statuses.add(new ArrayList<>(temp)); 

tempをクリアするとstatusesには影響しません。

+0

私は決して他のリストの中にネストされたリストを扱っていませんでした。おかげでそれは働いた! ^^ – Haruki

+0

@Harukiそれは値を渡しますが、その値は参照です。 – Eran

-1

実際には、3番目のprintlnにtempのサイズを表示しています。 あなたがstatusestempを入れると、そこtemp製のコピーではありませんが、唯一の参照が設定されます

System.out.println("kirai :" + statuses.size()); 
+0

これはtempを参照で使用するようになったが、代わりに statuses.size()を使用するのではなく、挿入されたリストのサイズをステータス内で確認したいからではない。 – Haruki

+0

ああ、申し訳ありませんが、私はそれがあなたの問題だったことを気づかなかったことを参照してpassigパラメータは、申し訳ありません:) – ThePoltergeist

+0

それは問題はない、私はそれを修正しました:) – Haruki

1

を試してみてください。

したがって、tempを直接使用するか、またはstatuses.get(0)を使用して作業すると、常に同じインスタンスが返されます。すべての変更は同じオブジェクト上にあります。