为什么值会在方法之外发生变化?

Why does the value change outside of the method?

我有这个代码:

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

为什么其他值保留在那里,即使它是在方法中添加的?

当您将对可变实例的引用(例如 Map<MyEnum, String> 引用)传递给方法时,该方法可以改变该实例的状态(假设它可以访问改变实例的方法).

如果您希望 myMethod 不改变您传递给它的 Map,您应该传递原始地图的副本。

因为每次在方法中传递参数时,您都没有创建地图的新对象,您只是在传递其引用,所以这意味着每次您的方法都获得相同的地图。