[英]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.