簡體   English   中英

將實例變量傳遞給靜態方法-並修改另一個實例變量?

[英]Pass in an instance variable to a static method — and modifies another instance variance?

所以我有一個靜態方法,該方法接受HashMap和其他一些參數並修改HashMap

public static void foo(HashMap map, other parameters)

假設我有一個名為Bar的類,該類具有兩個實例變量HashMap

我將其中一個HashMap傳遞給foo ,打算對其進行修改(並且不要將另一個HashMap傳遞進去)。 我是否正確地說,由於僅此一個方法調用,其他HashMap 不可能foo修改?

我問是因為這似乎正在發生在我身上...

我是否正確地說,由於僅此一個方法調用,其他HashMap不可能被foo修改?

答案可能是。

的確,如果不將對象的引用傳遞給方法,則無法訪問它。

但是Map存儲鍵-值對象對引用,但不存儲對象,如果兩個Map都共享對象作為鍵或值,則它將生效。

如果你有

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%正確,傳遞引用的值)。

對於存儲在兩個映射中的同一對象引用,您更改一個映射上的對象屬性將反映在另一個對象中的對象中,因為您正在更改同一對象的行為。 它將反映引用之處的更改。

如果喜歡

one = new HashMap();
two = one;

然后將一個傳遞給public static void foo(HashMap map, other parameters)然后在方法foo中對一個進行的更改也會影響兩個。

發生這種情況是因為它們中的一個和兩個都指向同一個對象。

事情會有所不同

one = new HashMap();
two = new HashMap();

我是否正確地說,由於僅此一個方法調用,其他HashMap不可能被foo修改?

如果兩個Map指向相同的對象引用,則在一個Map上所做的更改將影響另一個Map(如Mangus的答案所示)。

假設您的Map具有不同的實例,那么修改一個Map即將元素放置到Map或從地圖中刪除元素) 將不會直接影響另一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM