黑马程序员技术交流社区

标题: 个人理解String和StringBuffer做参数传递时的区别 [打印本页]

作者: 牛凌霄    时间: 2016-5-9 22:34
标题: 个人理解String和StringBuffer做参数传递时的区别
关于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的特性是一旦初始化就无法改变原值:我们用"+"操作字符串拼接时本质是产生了新对象!)
作者: 牛凌霄    时间: 2016-5-9 22:39
欢迎大家多多交流
作者: duanshengqiang    时间: 2016-5-9 22:52
厉害啊                        




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2