0
ArrayList<ArrayList<String>> list1 = new ArrayList<ArrayList<String>>();
ArrayList<String> list2 = new ArrayList<String>();

list2.add("foo");
System.out.println(list2); //[foo]
list1.add(list2);
System.out.println(list1); //[[foo]]
list2.set(0, "bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[bar]]

上記のコードは2つのリストを示しています。list2に(を含むfoo)を追加するとlist1、両方にが含まれるようになりますfoo。しかし、に変更するlist2barlist1も変更されます。list2addメソッドはtoのコピーのみを提供し、list1私が行うことは。list2に対して変更されないと常に思っていましたlist1

追加list2list1たがlist2、将来自由に変更できるようにして、list1再び影響を受けないようにするにはどうすればよいですか?

4

3 に答える 3

6

Java では、参照は参照されるオブジェクトではなく、値によって渡されます。これはlist2.add(list1);、参照を変更することはできませんlist1が、同じオブジェクトへの参照を取得し、変更すると表示されることを意味します。

これを書くべき方法は

List<List<String>> list1 = new ArrayList<List<String>>();
List<String> list2 = new ArrayList<String>();

list2.add("foo");
System.out.println(list2); //[foo]
list1.add(new ArrayList<String>(list2)); // take a copy of the list.
System.out.println(list1); //[[foo]]
list2.set(0, "bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[foo]]

また

list1.add(list2); 
list2 = new ArrayList<String>();
list2.add("bar");
System.out.println(list2); //[bar]
System.out.println(list1); //[[foo]]

上記の私の例は単純ですが、実際の問題はネストされたループなどに埋もれています。

List<List<String>> list1 = new ArrayList<List<String>>();

for(some loop) {
    List<String> list2 = new ArrayList<String>();
    // populate list2, can be smaller than the previous list2 !!
    list1.add(list2);
}
于 2012-12-29T14:54:06.973 に答える
1

どうlist1.add(list2.clone());ですか?list2これにより、 (メモリの割り当て、コンテンツのクローンなど)のコピーが作成され、それへの参照がlist1.

于 2012-12-29T14:54:44.087 に答える
0

すべてのアイテムを複製して、新しいリストに追加する必要があります。

于 2012-12-29T14:55:22.497 に答える