A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

关于String和StringBuffer在做参数传递时结果存在区别的个人理解:
视频里佳哥举了这样一个梨子:
(为了方便说明引用和形式参数进行了区分):
String s = new String("heima");
StringBuffer sb = new StringBuffer();
sb.append("heima");

void change(String str) {
        str += "abc";
}

void change(StringBuffer sb1) {
        sb1.append("abc");
}

当一个String引用(s)调用change方法后其值并没有发生改变;而StringBuffer的引用(sb)调用change方法其值却改变了。

我的理解简言之:
        老师讲过:字符串在做 "+" 拼接操作时,会在堆中生成StringBuffer(SB)对象,然后产生常量池中原字符串常量的副本,再将其“拿到堆中”与新字符串进行拼接操作(append()方法),再通过toString方法将拼接后的SB对象转化为String类的对象;
        理解了这一过程那么String做参数传递不该变原值,相当于基本数据类型这一说法就好理解了:s原本记录的是常量池中("heima")的地址值,调用change()方法时,s将地址值赋给了局部变量(形式参数)str,进行拼接操作后,又在堆中产生新的String类对象,然后将地址值赋给str,随后方法调用完毕,str消失,新的String类对象由于没有引用指向变为垃圾,但s记录的还是原常量池的地址,所以打印显示还是原字符串(没有改变原值);
        但SB的引用sb调用change方法时,sb将堆中对象的地址值赋给形参sb1,然后通过append进行拼接(添加)操作,对象属性发生了改变,注意这时操作的还是同一对象,此时就有了佳哥所说的两个引用(sb,sb1)指向同一对象,因此change方法调用完毕后,形参sb1也随之消失,但旧引用sb仍纪录着这个对象(属性已改变)的地址值,所以打印显示的是拼接后的字符串了。
        一针见血就是:进行拼接操作时,"+"会产生新对象,而append方法是在原对象上进行操作(也能侧面理解到为什么说String的特性是一旦初始化就无法改变原值:我们用"+"操作字符串拼接时本质是产生了新对象!)

2 个回复

正序浏览
厉害啊                        
回复 使用道具 举报
欢迎大家多多交流
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马