将实例变量传递给静态方法 - 并修改另一个实例方差?

时间:2013-07-26 04:55:47

标签: java hashmap

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

public static void foo(HashMap map, other parameters)

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

我将其中一个HashMap传递给foo,打算将其修改(并且不传递其他的HashMap)。我是否正确地说,由于只有这一个方法调用,其他HashMapfoo修改是不可能

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

4 个答案:

答案 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