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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄纪光 黑马帝   /  2011-9-28 22:07  /  2015 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

6 个回复

倒序浏览
黑马网友  发表于 2011-9-28 22:56:35
沙发
String 是不可变的字符序列,在执行字符串的连接时,会另外开辟一块内存空间,将两个连接的字符串放在新开辟的内存空间中进行连接,构成一个新的字符串,所以,string的内容不会改变。与String 相对应的是 StringBuffer,代表可变的字符序列,当要进行字符串的连接时,会直接在StringBuffer上开辟内存空间,直接将连接的字符串放在新开辟的内存中,构成一个新的字符串。所以,效率会更高,因此,在做字符串的连接时,通常用StringBuffer。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 23:17:08
藤椅
准确来说 ,是s 这个引用指向了一个新的对象
也就是"helloworld "   但是hello 这个对象还是在内存里面
你可以用
System.identityHashCode() 这个方法看他们的hashcode 值 ,不一样的
回复 使用道具 举报
黑马网友  发表于 2011-9-28 23:48:59
板凳
必须没有变,论坛上好像有不少同样的帖子了,嘎嘎,看来大家对这个都很关注啊,大概是这样的,原来有一个s,然后s+"XXX",这个并不是说就把原来那个堆空间内容变为"XXXXXX",而是重新建立一个内存空间,所以说是没有变的,
回复 使用道具 举报
黑马网友  发表于 2011-9-29 00:57:10
报纸
因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向了。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-29 03:21:24
地板

string类的问题

String s = “Hello”;s = s + “ world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?
答案是没有! 要明白的理解一句话 因为String被设计成不可变的类
如果你看官网文档中string会被标示为final型的
改变的是它对象的应用,只是这个应用不会指向这个字符串,但这个字符串还会在内存中,
学了C语言的 都知道指针的概念!就是位置偏移了而已,但还在!

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-29 07:49:10
7#
String是常量一旦创建不能修改,Stringbuffer和stringbuilder支持可变的字符串。
Java 语言提供对字符串串联符号("+")是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。
串联后的字符串新开辟了一块空间然后由s指向,原来的String对象应该还在。
你打印两个s的hashCode()会发现是不一样的。

评分

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

查看全部评分

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