黑马程序员技术交流社区

标题: 字符串变量所指对象的问题 [打印本页]

作者: 刘霄翔    时间: 2012-8-4 09:58
标题: 字符串变量所指对象的问题
String s = "Hello";
s = s + " world!";
今天看视频,老师说s所指向的对象没有发生改变。
s所指向的对象为什么没有发生改变?不是由"hello"变成"helloword!"吗?

求解惑啊!
作者: 陈冲    时间: 2012-8-4 10:05
使用String类创建的对象是不可变的,例如String s="Hello";那么s指向的对象的值始终是"Hello";
如果想要改变字符串的值,那么应该用StringBuffer创建对象。
作者: 乐凡    时间: 2012-8-4 10:28
字符串对象一旦建立就不会改变,因为它是字符串常量,常量一旦初始化就不会改变。
作者: 林康春    时间: 2012-8-4 10:32
看一下我发的图
把图里面的问题搞懂了
你这问题也就清楚了
注意:引用+字符串,一定会开新的内存空间!

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

QQ截图20120804103028.png

作者: 黑马张旭明    时间: 2012-8-4 10:54
林康春 发表于 2012-8-4 10:32
看一下我发的图
把图里面的问题搞懂了
你这问题也就清楚了

"hel"+"lo"="hello"=ox02这个看懂了,是在常量池中找相同的字符串然后和hello比较地址,但是后面的"hel"+lo为什么等于ox05,hel+“lo”为什么等于ox06,是怎么加的
作者: 林康春    时间: 2012-8-4 10:58
黑马张旭明 发表于 2012-8-4 10:54
"hel"+"lo"="hello"=ox02这个看懂了,是在常量池中找相同的字符串然后和hello比较地址,但是后面的"hel"+ ...

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






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