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

Java 为什么值在方法之外发生变化?,java,methods,Java,Methods,我有以下代码: private MyClass myMethod(HashMap<MyEnum, String> preferences, String type){ // stuff preferences.put(MyEnum.enum, type); MyClass myClass = ExtractMyClass(preferences); return myClass; } private MyClass myMethod(哈希映射首选项,字符串类型){ //东西

我有以下代码:

private MyClass myMethod(HashMap<MyEnum, String> preferences, String type){
// stuff 
preferences.put(MyEnum.enum, type); 
MyClass myClass = ExtractMyClass(preferences);
return myClass; 
}
private MyClass myMethod(哈希映射首选项,字符串类型){
//东西
preferences.put(MyEnum.enum,type);
MyClass MyClass=ExtractMyClass(首选项);
返回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; 

}
公共列表myBigClass(){
List myList=new ArrayList();
//做很多事情
Map preferences=newhashmap();
preferences.put(MyEnum.enum,“value0”);
添加(myMethod(首选项,“value1”);//第一次调用
添加(myMethod(首选项,“value2”);//第二次调用
添加(myMethod(首选项,“value3”);//第三次调用
返回myList;
}
在第一次调用中,
preferences
仅包含
value0

在第二次调用中,它包含
value0
”和
value1

在第三次调用中,它有
value0
value1
value2

我希望,对于这三个调用,
首选项
应该只有
值0


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

当您将对可变实例的引用(例如
映射
引用)传递给一个方法时,该方法可以改变该实例的状态(假设它可以访问改变该实例的方法)


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

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


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

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


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

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


如果你希望你的
myMethod
不改变你传递给它的
Map
,你应该传递一份原始Map的副本。

因为你每次在方法中传递参数时,你不是在创建Map的新对象,而是在传递它的引用,所以这意味着每次你的方法都得到相同的Map。

因为每次在方法中传递参数时,都不是在创建新的映射对象,而是在传递其引用,所以这意味着每次在方法中传递参数时,都是在获得相同的映射。

因为每次在方法中传递参数时,都不是在创建新的映射对象,所以只是在传递其引用,所以这意味着ea每次你的方法得到相同的映射。

因为每次你在方法中传递参数时,你不是在创建映射的新对象,你只是在传递它的引用,所以这意味着每次你的方法得到相同的映射。

基本上你想了解传递值和传递引用之间的区别;以及如何传递-bJava中的y值仍然会导致您观察到的结果。初学者请参见此处…我已经读过了,谢谢您,基本上您想了解传递值和传递引用之间的区别;以及Java中的传递值如何仍然导致您观察到的结果。初学者请参见此处…我已经读过了,感谢您,基本上您想了解按值传递和按引用传递之间的区别;以及Java中的按值传递如何仍然导致您所观察到的结果。首先,请看这里……我已经读过了,感谢您,基本上您想了解按值传递和按引用传递之间的区别;以及Java中传递值的方式仍然会导致您所观察到的结果。初学者请参见这里……我已经读到了,谢谢ThoughtWorks很棒。谢谢。很棒。谢谢。很棒。谢谢。很棒。谢谢。很棒。很棒。谢谢。很棒。谢谢。