String、StringBuilder函数传参的执行过程

遇到下面一段代码,结果是什么:
 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值