我是否正确地说,HashMap
由于只有一个方法调用,另一个就不可能被 foo 修改?
如果两个Map
s 都指向同一个对象引用,那么对其中一个进行的更改Map
将影响另一张地图(如 Mangus 的回答所示)。
假设您Map
的 s 有不同的实例,那么修改一个Map
(即在地图中放置或删除元素)将永远不会直接影响另一个。但是如果Map
s 在 key 或 value 中共享一个公共对象引用,并且这个对象引用在其中一个Map
s 中被修改,那么存储在另一个中的对象引用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