ArrayList を処理する関数を作成し、リストを外部の呼び出し元に渡したいと考えています。しかし、関数を呼び出した後、リストが変更されていないことがわかりました。
ここにいくつかのテストコードがあります(これはデモですが、私の問題を示しています):
@Test
public void testList() {
List<Integer> l1 = new ArrayList<Integer>(5);
List<Integer> l2 = new ArrayList<Integer>(5);
l1.add(11); l1.add(12); l1.add(13); l1.add(14); l1.add(15);
l2.add(21); l2.add(22); l2.add(23); l2.add(24); l2.add(25);
System.out.println("outer l1: " + l1);
System.out.println("outer l2: " + l2);
subList(l1, l2); //call the function
System.out.println("after l1: " + l1);
System.out.println("after l2: " + l2);
}
protected static void subList(List<Integer> l1, List<Integer> l2) {
l1.remove(0); l1.remove(0);
l2 = l2.subList(0, 4);
System.out.println("inner l1: " + l1);
System.out.println("inner l2: " + l2);
}
結果は次のとおりです。
outer l1: [11, 12, 13, 14, 15]
outer l2: [21, 22, 23, 24, 25]
inner l1: [13, 14, 15] (in function, changed)
inner l2: [21, 22, 23, 24] (in function, changed too)
after l1: [13, 14, 15] (changed)
after l2: [21, 22, 23, 24, 25] (unchanged?!)
関数subList(List l1, List l2)によって List2 は変更されていないようですが、List1 は変更されています。
List パラメーターは CopyValue によって渡されますか?? では、関数内で l2 の参照が変更されると、JVM は新しいリストをコピーし、元の外側のリストは古い値を維持しますか?
ArrayList を変更する 「副作用」プロシージャを作成する方法は?