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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵磊 黑马帝   /  2011-7-20 12:30  /  2561 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s="hello";s=s+"word!";这两行代码执行后,原始的String对象中的内容改变了没有?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 你说呢,看在新人的份上加1分

查看全部评分

4 个回复

倒序浏览
黑马网友  发表于 2011-7-20 13:10:21
沙发
原始的String对象内容没有改变 !!不过随后会被垃圾回收器回收。
String s="hello",这里产生一个hello对象。
在执行s=s+"world"时,首先将s包装成StringBuilder对象变成:
s=new StringBuilder(s).append(“world”);这个操作是jvm自动做出的决定,这样将会大大增加运行的效率,同时也节约了空间。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 你这回答够专业水准的

查看全部评分

回复 使用道具 举报
[code=java]public class TEST {
public static void main(String[] args)
{
         String s="hello";
         System.out.println(s);
         s=s+"word!";
         System.out.println(s);
         
        }
}[/code]输出结果:
hello
helloword!


原始的String对象中的内容没了,被重新写入了。
[ 本帖最后由 lihaihan 于 2011-07-20  13:24 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
admin + 1 虽然给你分,不代表你说对了

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 15:17:11
板凳
原来的没变。string s="hello";这样定义的hello应该是放在data 内存中,将内存地址赋给s。data中开辟了两个存储空间,一个放hello,一个放hello world,只不过s=hello world后,s中放的已经不是hello的内存地址了,是hello world的了,但两字符串仍都存在在内存空间中。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 15:47:34
报纸
对字符串对象进行操作时,java虚拟机在函数内部对字符串进行了特殊的处理视string对象为常量,对传进来的引用地址所引用的对象不能直接进行操作而是产生一个副本对其进行操作,所以原始对象不会改变。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 对头

查看全部评分

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