黑马程序员技术交流社区

标题: 关于 string 的迷惑 [打印本页]

作者: 王玮    时间: 2012-12-28 09:37
标题: 关于 string 的迷惑
String str1="ab";   
String str2="cd";   
String str3=str1+str2;   
System.out.println(str3=="abcd");   

这段代码 创建了几个对象,都创建在内存的哪,最后的运行结果是什么?


作者: 马铿    时间: 2012-12-28 10:34
本帖最后由 马铿 于 2012-12-28 10:45 编辑

4个对象,3个常量,打印结果为false
s1,s2,s3在栈里,s1+s2在堆里,ab,cd,abcd在常量池中
ab,cd,abcd也是对象
作者: 冉世友    时间: 2012-12-28 11:01
总共有4个对象吧,str1,str2,str3,“abcd”
栈内存里有str1,str2,str3,“ab”,“cd”,“abcd”在常量池里,str1+str2在堆里
因为字符串相加通过把str1,str2转换为StringBuffer对象,再连接,再调用toString()方法得到新的字符串对象,运算结果“abcd”被回收,
所以str3=="abcd"为false
作者: 谢辉林    时间: 2012-12-28 11:18
首先 str1和str2存储的是堆中两个字符串对象的地址,而当执行str1+str2时,jvm首先会在堆中创建一个
StringBuilde类,同时用str1指向的字符串对象完成初始化,然后调用append方法完成对str2所指向
的字符串的合并操作,接着调用StringBuilder的toString()方法在堆内存中创建一个String对象
,最后将生成的String对象的堆地址存放在Str3中 而str3存储的是常量池中"abcd"所对应的字符串对象的地址,所以最后的结果为false
总共有4个对象吧,str1,str2,str3,"abcd"
作者: 王少雷    时间: 2012-12-28 11:26
如上所说,4个对象啊。肯定在堆栈里,都是按创建顺序排放的。
运用结果 肯定是false啊
比较字符串 用 equals




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2