所以我有一个静态方法,它接收HashMap
和其他一些参数并修改HashMap
:
public static void foo(HashMap map, other parameters)
假设我有一个名为Bar
的类,它有两个实例变量HashMap
。
我将其中一个HashMap
传递给foo
,打算将其修改(并且不传递其他的HashMap)。我是否正确地说,由于只有这一个方法调用,其他HashMap
被foo
修改是不可能?
我问,因为这似乎发生在我身上......
答案 0 :(得分:1)
我是否正确地说其他HashMap不可能 只有这一个方法调用才能被foo修改?
答案可能是。
确实如果你没有将对象的引用传递给方法,你就无法访问它。
但是Map存储键值对象引用,它不存储对象,如果两个地图共享对象作为键或值,那么它会起作用。
答案 1 :(得分:1)
如果你有
Map<String,String> map1=new HashMap<String,String>();
和
Map<String,String> map2=new HashMap<String,String>();
如果将map1传递给方法,则对map1的任何更改都不会反映在map2中
因为map1和map2代表内存中的两个不同对象。
如果要分配map1=map2
,则两个映射都引用同一个对象,因此修改一个对象将反映在另一个对象引用中。 Java通过引用传递对象(这不是100%正确,传递引用的值)。
对于存储在两个地图中的相同对象引用,您更改一个地图上的对象的属性将反映在另一个对象中的对象中,因为您正在更改同一对象的行为。它将反映所引用的变化。
答案 2 :(得分:0)
如果喜欢
one = new HashMap();
two = one;
然后将一个传递给public static void foo(HashMap map, other parameters)
然后在方法foo中对一个进行的更改也将影响两个。
这是因为它们中的一个和两个都指向同一个对象。
的情况会有所不同
one = new HashMap();
two = new HashMap();
答案 3 :(得分:0)
我是否正确地说,由于只有这一个方法调用,其他
HashMap
不可能被foo修改?
如果两个Map
指向同一个对象引用,则对一个Map
所做的更改将影响另一个地图(如Mangus的回答所示)。
假设您的Map
具有不同的实例,那么修改一个Map
(即在地图中添加或删除元素)将永远不会直接影响另一个。 但是如果Map
在键或值中共享一个公共对象引用,并且在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