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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲁中需 中级黑马   /  2012-10-23 21:41  /  1635 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 鲁中需 于 2012-10-25 21:57 编辑

String s = "hello";
s = s + "_world!"
这两句代码执行后,原始的String对象中的内容到底变了没有?为什么?

评分

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

查看全部评分

5 个回复

正序浏览
没有变, String类是不可变的类,s指向的是一个String对象,然后下面s=s+"_world"对s进行了操作,但s所指向的String对象没有变。这时候s指向了另一个对象内容是“hello_world”,原来那个对象还在内存中并没有改变。
回复 使用道具 举报
你说的涉及到内存了。
String类是被final修饰的,所以String里存放的内容是不能被改变的。
但是我们平时使用时却感觉是可以随时改变的。
这是因为当执行这段代码的时候,s = s + "_world!"
java会在方法区添加新的值,将 s 和 _world! 连接起来,然后再将s 指向这个区域。
但是原来的值是没有变的。
回复 使用道具 举报
String常量字符串, 'hello'本身是一个字符串 在字符串常量池中 ,  这个里面的内容是不会被改变的 , 当s发现没有hello_world 这个字符串时 , 就会创建一个新的,并把它的引用赋给S 所以S中的引用是改变了,
回复 使用道具 举报
String s = "hello"; 这句后栈内存中有一个 s ,指向堆内存中的一个字符串 "hello" 。
s + "_world!"; 这句执行时 ,先找到 s 引用的字符串"hello",然后和 "_world!"相加。
最后将 s 重新指向两者相加的值"hello_world“。
原先的 hello 和 world ,因为没有指向就自动被垃圾回收机制回收。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 梁枝武 于 2012-10-23 21:58 编辑

String s = "hello"; 等效于:
char data[] = {'h','e','l','l','o',};
String s = new String(data);
这里的“+”是连接符,s = s + "_world!"后data = {'h','e','l','l','o','_','w','o','r','l','d','!'};
故最终s = "hello_world!"

评分

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

查看全部评分

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