String、StringBuffer的理解

本文深入探讨了Java中字符串String与StringBuffer在方法调用时的参数传递机制,通过具体示例展示了两者在堆栈内存中的行为差异,解释了为何StringBuffer的变化能够被外部方法捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	public static void main(String[] args){
		String s1="hello";
		String s2="world";

		changeStr(s1,s2);
		System.out.println(s1+"--"+ s2);

		StringBuffer sb1 = new StringBuffer("hello");
		StringBuffer sb2 = new StringBuffer("world");
		
		changeSb(sb1,sb2);
		System.out.println(sb1.toString()+"--"+sb2.toString());
	}

	public static void changeStr(String x,String y){
		x = y;
		y = x+y;
	}
	public static void changeSb(StringBuffer x,StringBuffer y){
		x = y;
		y.append("****add a tail");
	}

对以上两句话的执行结果,第一个是没有问题的,都知道是:hello--world

然而第二句话,以为执行结果是:world--world****add a tail ,但其实结果是:hello--world****add a tail

 

从堆栈的角度来理解

StringBuffer传递到changeSb方法里的是引用,这里特意写了形参为x,y就是为了避免混淆:

 

在changeSb方法里,两个地址的名称是x,y,假如x对应地址0x1111,y对应地址0x2222,当change方法执行到最后,

x中保存的地址是0x2222,y中保存的地址是0x2222,此时

0x1111对应的内容---------"hello"

0x2222对应的内容---------"world****add a tail";

 

而在main方法里,两个地址的名称是sb1,sb2,

sb1中保存的地址是0x1111,sb2中保存的地址是0x2222,

所以打印出的结果应该是  hello--world****add a tail

(参考:https://blog.youkuaiyun.com/qq_38225558/article/details/82054486

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值