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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乞文超 中级黑马   /  2012-4-21 18:05  /  2600 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

5 个回复

倒序浏览
  没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向了。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐鑫 于 2012-4-21 18:37 编辑

1.所有的基本数据类型全部是存储在栈里面,速度快。
2.一个对象,他的实体是存储在堆里面的,而他的引用是存储在栈里面。
例子:
String s=new String("123");
这个s就在栈里面,而他的"123"这个对象在堆里面。 s 指向"123";

也就是原对象还是Hello,而现在又新建了个Helloworld!并且通过赋值 s = s+“world”,s的指向更改为Helloworld!,堆里有了2个对象

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
String是不可变类,原始对象内容没变,s指向的对象变了
回复 使用道具 举报
本帖最后由 陈坚 于 2012-4-21 19:40 编辑

在这里我画了一个简图来解析一下
回复 使用道具 举报
String类型的值是不变的 String i="1"+"0"; 看似只改变了其实只是引用的值改变了  如果你的字符串变量的值会修改的话 可以用StringBuffer类  它的值是可以改变的而且支持多线程  而且修改值时候耗费的资源更少  这点可以在JDK的源码中体现 源码中的类的toString 方法都是用的StringBuffer类来操作的字符串并且返回 所以在字符串的值不确定是用StringBuffer性能更大
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马