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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘霄翔 初级黑马   /  2012-8-4 09:58  /  1570 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = "Hello";
s = s + " world!";
今天看视频,老师说s所指向的对象没有发生改变。
s所指向的对象为什么没有发生改变?不是由"hello"变成"helloword!"吗?

求解惑啊!

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1 加油

查看全部评分

7 个回复

倒序浏览
使用String类创建的对象是不可变的,例如String s="Hello";那么s指向的对象的值始终是"Hello";
如果想要改变字符串的值,那么应该用StringBuffer创建对象。
回复 使用道具 举报
字符串对象一旦建立就不会改变,因为它是字符串常量,常量一旦初始化就不会改变。
回复 使用道具 举报
看一下我发的图
把图里面的问题搞懂了
你这问题也就清楚了
注意:引用+字符串,一定会开新的内存空间!

QQ截图20120804103028.png (14.84 KB, 下载次数: 1)

QQ截图20120804103028.png

评分

参与人数 2技术分 +1 黑马币 +15 收起 理由
职业规划-刘倩老师 + 1
杨志 + 15 继续加油!

查看全部评分

回复 使用道具 举报
林康春 发表于 2012-8-4 10:32
看一下我发的图
把图里面的问题搞懂了
你这问题也就清楚了

"hel"+"lo"="hello"=ox02这个看懂了,是在常量池中找相同的字符串然后和hello比较地址,但是后面的"hel"+lo为什么等于ox05,hel+“lo”为什么等于ox06,是怎么加的
回复 使用道具 举报
黑马张旭明 发表于 2012-8-4 10:54
"hel"+"lo"="hello"=ox02这个看懂了,是在常量池中找相同的字符串然后和hello比较地址,但是后面的"hel"+ ...

注意:引用+字符串,一定会开新的内存空间啊 记得这句话就可以了
因为有引用 也就是在堆内存有新的空间出现
回复 使用道具 举报
谢谢,问题已解决
回复 使用道具 举报
引用数据类型s声明比赋值语句执行时,会在栈内存中开辟一个空间存放s,会在堆内存中开辟一个空间,用于存放字符串"hello",然后把它的地址值赋给栈内存中的s,最后会把字符串"hello"存入常量池中;
s = s + " world!";
执行第二行代码的时候,会在堆内存中新创建一个空间存放"helloworld",并将它的地址值赋给栈内存中的s,就是改变了s的指向,存放"hello"的空间里面的内容没有改变

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马