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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李会成 中级黑马   /  2013-2-4 15:23  /  1210 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-6 15:17 编辑

class StringBuffertest{
public static void main(String[] args){
String str1="从来富贵不是梦";
str1=str1+"未有圣贤不读书";      //注意此str1的存储地址已发生变化
System.out.println(str1);
StringBuffer sb1=new StringBuffer("精思生智慧,");
StringBuffer sb2=sb1.append("慧可解怨!");    //注意sb1和sb2指向同一个地址
sb2.insert(6,"识可转智,");
System.out.println("sb1="+sb1);
System.out.println("sb2="+sb2);
sb1.append(Math.E);
System.out.println(sb1);
System.out.println(sb1.charAt(2));
System.out.println("sb1的长度="+sb1.length());
System.out.println("sb1的容量="+sb1.capacity());


}
}
里面的两行注释我不明白,这段代码里面的:
System.out.println("sb1="+sb1);
System.out.println("sb2="+sb2);
这两条代码为什么输出的值是一样的?课本说它们指向同一个地址是怎么回事?

4 个回复

倒序浏览
StringBuffer sb1=new StringBuffer("精思生智慧,");
StringBuffer sb2=sb1.append("慧可解怨!");    //注意sb1和sb2指向同一个地址
毕老师讲的很清楚呀,面盆理论 多精辟
StringBuffer就相当于一个面盆,你用append往面盆里再加一点东西,会产生两个面盆吗?还是同一个面盆呀,只不过里边的东西多了,面盆里的东西变了而已

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
楼主 注意 楼主只new了一个对象, 如楼上所说 也就是只有一个盆 sb1  和sb2 只是指向这一个盆的两个指针而已  也就是说sb1  和sb2 都指向了同一个StringBuffer 对象,
则然他们指向的地址是相同的  既然都是这一个盆里的内容,自然倒出的东西是一样的,也就是说输出结果是一样的。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
        希望我的图片说明对你有帮助,实质就是sb1和sb2我们都成为引用变量。那什么是引用变量呢。这其实就是C语言里的指针概念。它所占内存并不存放实际的值,而是存放另外一个变量的地址,存放的变量的地址中装载了sb1的实际的字符串内容。你采用了sb2=sb1的模式,眼下之一就是让sb2和sb1指向堆内存里的同一个字符串对象。

未命名.JPG (19.84 KB, 下载次数: 23)

堆内存与栈内存示例

堆内存与栈内存示例

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
请勿复制他人帖子,技术分不是入学的门槛而是为了帮助大家学习而存在的。

请勿再次发此类帖子了!

此贴就关闭了。此后如有再次发现直接封禁处理,请看到此贴的会员也加以注意。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马