HashMap
この 1 つのメソッド呼び出しだけの結果として、他のものを foo で変更することは不可能だと言っているのは正しいですか?
両方Map
の s が同じオブジェクト参照を指している場合、一方に加えられた変更はMap
もう一方のマップに影響します (Mangus の回答に示されているように)。
Map
に異なるインスタンスがあると仮定すると、 1 つを変更Map
(つまり、要素をマップに配置またはマップから削除) しても、他のインスタンスに直接影響することはありません。ただし、Map
がキーまたは値で共通のオブジェクト参照を共有し、このオブジェクト参照がいずれかの で変更Map
されると、もう一方に格納されているオブジェクト参照Map
も変更されます。これをコードで表示するには:
class FooClass {
private int fooInt;
public FooClass(int fooInt) {
this.fooInt = fooInt;
}
//getters and setters...
}
class MapHolder {
private Map<String, FooClass> mapOne;
private Map<String, FooClass> mapTwo;
public MapHolder() {
mapOne = new HashMap<>();
mapTwo = new HashMap<>();
}
public void init() {
FooClass foo = new FooClass(10);
//note that we're putting the same FooClass object reference in both maps
mapOne.put("foo", foo);
mapTwo.put("bar", foo);
}
//getters and setters...
}
class TestMapModification {
public static void foo(Map<String, FooClass> map, String key) {
//for testing purposes, we will modify the value of the passed key
FooClass foo = map.get(key);
if (foo != null) {
foo.setFooInt(foo.getFooInt() * 2);
}
}
public static void main(String[] args) {
MapHolder mapHolder = new MapHolder();
mapHolder.init();
System.out.println(mapHolder.getMapOne().get("foo").getFooInt());
System.out.println(mapHolder.getMapTwo().get("bar").getFooInt());
foo(mapHolder.getMapOne(), "foo");
System.out.println("But I just modified mapOne!");
System.out.println(mapHolder.getMapOne().get("foo").getFooInt());
System.out.println(mapHolder.getMapTwo().get("bar").getFooInt());
}
}
コードの実行結果
10
10
But I just modified mapOne!
20
20