リストは、リストに格納されている元の値へのオブジェクト参照を維持しています。したがって、この行を実行すると:
Integer x = i.next();
とリストの両方x
が同じオブジェクトへの参照を格納しています。ただし、実行すると:
x = Integer.valueOf(9);
リストは何も変更されていませんがx
、別のオブジェクトへの参照が格納されています。リストは変更されていません。次のようないくつかのリスト操作メソッドを使用する必要があります。
list.set(index, Integer.valueof(9))
注:他の人が示唆しているように、これはの不変性とは何の関係もありません。Integer
これは、基本的な Java オブジェクト参照の動作です。
ポイントを説明するのに役立つ完全な例を次に示します。ListIterator
これは、イテレーションの途中でアイテムの削除/設定をサポートするクラスを使用することに注意してください。
import java.util.*;
public class ListExample {
public static void main(String[] args) {
List<Foo> fooList = new ArrayList<Foo>();
for (int i = 0; i < 9; i++)
fooList.add(new Foo(i, i));
// Standard iterator sufficient for altering elements
Iterator<Foo> iterator = fooList.iterator();
if (iterator.hasNext()) {
Foo foo = iterator.next();
foo.x = 99;
foo.y = 42;
}
printList(fooList);
// List iterator needed for replacing elements
ListIterator<Foo> listIterator = fooList.listIterator();
if (listIterator.hasNext()) {
// Need to call next, before set.
listIterator.next();
// Replace item returned from next()
listIterator.set(new Foo(99,99));
}
printList(fooList);
}
private static void printList(List<?> list) {
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next());
}
System.out.println();
}
private static class Foo {
int x;
int y;
Foo(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return String.format("[%d, %d]", x, y);
}
}
}
これは印刷されます:
[99, 42][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
[99, 99][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]