首先要明確Java都是按照值傳遞的。
public static void main(String[] args) {
String x = new String("aaa");
change1(x);
System.out.println(x);
System.out.println("--------------------------");
}
private static void change1(String x) {
x ="bbb";
}
輸出的結(jié)果是:aaa
原因:當將x傳遞給change()方法時,將傳遞x值的復(fù)制品(引用)。
這時候change()方法里的x只是原來String x = new String("aaa");中x的副本。然后x="bbb",相當于x副本重新引用了一個"bbb",這與原來的x無關(guān)。

image.png
String和其他對象的不同:
public static void main(String[] args) {
StringBuilder str = new StringBuilder("aaa");
change2(str);
System.out.println(str);
System.out.println("--------------------------");
StringBuilder str2 = new StringBuilder("aaa");
change2_1(str2);
System.out.println(str2);
System.out.println("--------------------------");
List<String> ls = new ArrayList<>();
ls.add("aaa");
change3(ls);
System.out.println(ls);
}
private static void change2(StringBuilder str) {
str = new StringBuilder("ccc");
}
private static void change2_1(StringBuilder str2) {
str2.append("bbb");
}
private static void change3(List<String> ls) {
ls.add("ccc");
}
輸出結(jié)果:

result.png
結(jié)論:Java在值傳遞的時候都會copy一個副本,關(guān)鍵是副本變量存儲引用,而不是引用本身!?。∪绻覀冋娴男枰淖儗ο蟮闹?。首先,對象應(yīng)該是可變的,例如StringBuilder,List,各種自定義的entity等。。。其次,我們需要確保沒有創(chuàng)建新對象并將其分配給參數(shù)變量,因為Java只傳遞值。