Java String的值传递机制
Java中数据类型的传递分为值传递和引用传递。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
※此外,String是引用数据类型,但是值传递方式比较特殊,使用String类型的对象作为参数传递时,也不会改变原来的String对象。
实际上,传参时不应该分成基本数据类型和引用数据类型,因为包含String和StringBuilder/StringBuffer都不会改变原来的对象值。
public class InterViewTest {
public static void main(String[] args) {
String m = "A";
String n = "B";
StringBuffer a = new StringBuffer("X");
StringBuffer b = new StringBuffer("Y");
System.out.println("m = " + m + ", n = " + n);
System.out.println("a = " + a + ", b = " + b);
// 交换m和n的值
// 方式1
// String temp = m;
// m = n;
// n = temp;
//方式2
InterViewTest test = new InterViewTest();
test.swap(m, n);
test.swap1(a, b);
System.out.println("--------------------");
System.out.println("m = " + m + ", n = " + n);// 方式1时m = 20, n = 10, 方式2时m = 10, n = 20
System.out.println("a = " + a + ", b = " + b);//a = X, b = Y
}
public void swap(String m, String n) {
String temp = m;
m = n;
n = temp;
System.out.println("m = " + m + ", n = " + n);
}
public void swap1(StringBuffer m, StringBuffer n) {
StringBuffer temp = m;
m = n;
n = temp;
System.out.println("m = " + m + ", n = " + n);
}
}
但是会有这种情况
public class InterviewTest1 {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
String str = new String();
operate(a, b);
System.out.println(a + "," + b);// ABx,B
}
public static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
y.append('x');
}
}
这时的a作为参数,却被更改了原值,是因为a是作为StringBuffer的实例被使用,同时StringBuffer类中的append()方法是返回该实例。
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}
而InterViewTest中的swap/swap1是void修饰,且没有 return this。因此没有被修改原值。