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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 呆呆呆 中级黑马   /  2013-12-20 15:03  /  1147 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 呆呆呆 于 2013-12-20 17:23 编辑

String有何特别之处:
String s = "Hello";s = s + " world!";
这两行代码执行后,原始的String对象中的内容到底变了没有?

评分

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

查看全部评分

4 个回复

倒序浏览
原始的String对象中的内容没有变化,String是长度不可变的,你如果直接打印两个s的地址会发现两个地址不一样。StringBuilder是长度可变的
回复 使用道具 举报
字符串一旦初始化就不可以被改变
     注意:这里指的是字符串在常量池里面的值不能发生改变。而不是说字符串的引用不能变。
String s = "Hello";
java虚拟机先在常量池中找是否有Hello,如果有,就把这个地址赋值给s,如果没有就创建一个"Hello",并把这个地址赋值给s;
s = s + "world!";
java虚拟机先把字符串连接起来变为"Helloworld!",然后再在常量池中找,如果找到就把地址赋值给s,如果没找到就创建一个字符串"Helloworld!",并把这个地址赋值给s.
这两次执行完,s的地址变了,对象的内容是变不了的,因为字符串一旦初始化就不可以被改变,变得只能是地址。

评分

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

查看全部评分

回复 使用道具 举报
因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象就发生了改变,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向了。

评分

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

查看全部评分

回复 使用道具 举报
一道问题学了很多  受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马