2015-04-08 16 views
0

我有這樣的代碼:爲什麼值會在方法之外改變?

private MyClass myMethod(HashMap<MyEnum, String> preferences, String type){ 
// stuff 
preferences.put(MyEnum.enum, type); 
MyClass myClass = ExtractMyClass(preferences); 
return myClass; 
} 

我把這種方法在這裏:

public List<MyClass> myBigClass(){ 
List<MyClass> myList = new ArrayList<>(); 
//do a lot of stuff 
Map<MyEnum, String> preferences = new HashMap<>(); 
preferences.put(MyEnum.enum, "value0"); 

myList.add(myMethod(preferences, "value1")); //first call 
myList.add(myMethod(preferences, "value2")); //second call 
myList.add(myMethod(preferences, "value3")); //third call 

return myList; 

} 

在第一次調用,preferences只包含value0

在第二次調用,它包含了value0「和value1

而在第三次調用中,它有value0value1value2

我想的是,三個電話,preferences應該只有value0

爲什麼其他值呆在那裏,即使這是一個方法裏面添加?

+1

基本上你想了解通過值和傳遞參考之間的區別;以及Java中傳遞值的方式仍然會導致您正在觀察的結果。看到這裏http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value首發... – GhostCat

+0

我已經讀過,謝謝 – Mel

回答

4

當您將一個對可變實例(例如Map<MyEnum, String>引用)的引用傳遞給方法時,該方法可以改變該實例的狀態(假設它可以訪問變更實例的方法)。

如果你希望你的myMethod不要改變Map你傳遞給它,你應該傳遞你的原始地圖的副本。

+0

偉大的作品。謝謝。 – Mel

0

因爲每次當您在方法中傳遞參數時,您都不會創建新的地圖對象,您只是傳遞其引用,這意味着每次您的方法獲得相同的地圖。

相關問題