值传递
值传递不会改变原有变量的值,适合于基本数据类型及其包装型如String,int等。
下面是一个修改名字的例子:
public class PassValue {
public static String name;
public static void main(String[] args) {
name="John";
PassValue passValue=new PassValue();
passValue.changeName(name);//值传递,John还是John,不会变成Mary
System.out.println(name);//输出John
}
public void changeName(String name){
name="Mary";
}
}
上面的结果输出的是John,可以看出,值传递根本没有改变原值。
但是要注意这样的情况:如果是基本数据类型&包装型的数组比如int[],String[]等,此时将数组传递时是传的数组对象引用,因此会改变!
引用传递
引用传递多用于修改对象引用,修改对象的引用会对原对象起作用。请看实例:
import lock.MyVolatile;
import java.util.HashMap;
import java.util.Set;
public class PassRef {
public static HashMap<String, String> testMap = new HashMap<>();
public static void main(String[] args) {
testMap.put("k1", "v1");
testMap.put("k2", "v2");
testMap.put("k3", "v3");
PassRef passRef = new PassRef();
passRef.change(testMap);//引用传递,会变
//输出结果
Set res = testMap.entrySet();
for (Object item : res) {
System.out.println(item);//输出中包含k4=v4
}
}
public void change(HashMap<String, String> arg) {
arg.put("k4", "v4");
}
}
上面的代码输出结果为:
k1=v1
k2=v2
k3=v3
k4=v4
结果包含了k4,注意因为是EntrySet,所以输出是不一定是有序的。