遇到下面一段代码,结果是什么:
public class StringbuilderAppend {
public static void test(StringBuilder x,StringBuilder y){
x.append(y);
y=x;
}
public static void main(String[] args) {
StringBuilder a=new StringBuilder("A");
StringBuilder b=new StringBuilder("B");
test(a,b);
System.out.println(a);
System.out.println(b);
}
}
StringBuilder的append方法,append方法的操作是直接在原来的数据上进行字符串拼接;append操作是在原有对象的基础上进行的;
由于append方法是在原有对象的数据上进行操作的,所以执行完x.append(y);这一句代码后,x指向的数据就变化了,但x的地址没有变,
又由于a和x的地址一样,指向同一个对象,虽然a和x的指向都没变,但是他们指向的数据发生了改变;所以a地址指向的数据也变化了;
y=x;这使形参y指向x的对象,只改变了形参y的指向,并没有改变实参b的指向,所以b的值不变;
再来说一下String,先通过一段代码来引入:
public class StringTest {
public static void test(String x,String y){
x=x+"A";
y=y+"A";
System.out.println("x:"+x);
System.out.println("y:"+y);
}
public static void main(String[] args) {
String a="C";
String c="D";
test(a,c);
System.out.println(a);
System.out.println(c);
}
}
结果为:
首先,我们要明确一点:String类型是不可变的,是指其地址不可变,但其引用指向的内容是可变的;
String类由final修饰:
public final class String implements Serializable, Comparable<String>, CharSequence’
且String类继承了Comparable接口,自身带有比较的功能;
上述代码的执行如下:
代码中a、c为实参,调用函数,将a的地址 、c的地址传递给形参x、y,会发现a、x地址相同,指向同一个值;c、y地址相同,指向同一个值;
在函数中,对x、y进行操作,
x=x+"A";
y=y+"A";
因为String类型是不可变的(引用不可变,引用指向的内容可变),它是取出x的值与‘A’相拼接,形成一个新的String对象,使 x重新 指向该新对象;所以 x 的地址改变了,指向的值改变了,但a的地址并没有变,且a指向的内容也没有变;同理,对y和c也是一样,所以会出现这样的结果;
https://blog.csdn.net/fll980205/article/details/100597922