2

所以我有一个静态方法,它接受 aHashMap和其他一些参数并修改HashMap

public static void foo(HashMap map, other parameters)

假设我有一个名为的类Bar,它有两个实例变量HashMap

我将其中一个HashMaps 传递给foo,打算对其进行修改(并且不要传递另一个 HashMap )。我是否正确地说,仅此一个方法调用就不可能HashMap修改另一个?foo

我问,因为这似乎发生在我身上......

4

4 回答 4

2

如果你有

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% 正确的,传递了引用的值)。

对于存储在两个映射中的相同对象引用,您更改一个映射上对象的属性将反映在另一个对象中的对象中,因为您正在更改同一对象的行为。它将反映所引用的任何更改。

于 2013-07-26T05:25:55.227 回答
1

我是否正确地说,由于只有一个方法调用,其他 HashMap 不可能被 foo 修改?

答案是可能。

确实,如果您不将对象的引用传递给方法,则无法访问它。

但是Map存储key-value Object pair reference,它不存储Objects,如果两个map共享Object作为key或者value,那么就会生效。

于 2013-07-26T04:59:03.297 回答
0

如果喜欢

one = new HashMap();
two = one;

并且您将一个传递给public static void foo(HashMap map, other parameters) 然后对方法 foo 中的一个所做的更改也会影响两个。

发生这种情况是因为它们中的一个和两个都指向同一个对象。

事情会有所不同

one = new HashMap();
two = new HashMap();
于 2013-07-26T05:04:16.350 回答
0

我是否正确地说,HashMap由于只有一个方法调用,另一个就不可能被 foo 修改?

如果两个Maps 都指向同一个对象引用,那么对其中一个进行的更改Map将影响另一张地图(如 Mangus 的回答所示)。

假设您Map的 s 有不同的实例,那么修改一个Map(即在地图中放置或删除元素)将永远不会直接影响另一个。但是如果Maps 在 key 或 value 中共享一个公共对象引用,并且这个对象引用在其中一个Maps 中被修改,那么存储在另一个中的对象引用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
于 2013-07-26T05:19:08.860 回答