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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王玮 中级黑马   /  2012-12-28 09:37  /  1502 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str1="ab";   
String str2="cd";   
String str3=str1+str2;   
System.out.println(str3=="abcd");   

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

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 马铿 于 2012-12-28 10:45 编辑

4个对象,3个常量,打印结果为false
s1,s2,s3在栈里,s1+s2在堆里,ab,cd,abcd在常量池中
ab,cd,abcd也是对象

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
总共有4个对象吧,str1,str2,str3,“abcd”
栈内存里有str1,str2,str3,“ab”,“cd”,“abcd”在常量池里,str1+str2在堆里
因为字符串相加通过把str1,str2转换为StringBuffer对象,再连接,再调用toString()方法得到新的字符串对象,运算结果“abcd”被回收,
所以str3=="abcd"为false

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先 str1和str2存储的是堆中两个字符串对象的地址,而当执行str1+str2时,jvm首先会在堆中创建一个
StringBuilde类,同时用str1指向的字符串对象完成初始化,然后调用append方法完成对str2所指向
的字符串的合并操作,接着调用StringBuilder的toString()方法在堆内存中创建一个String对象
,最后将生成的String对象的堆地址存放在Str3中 而str3存储的是常量池中"abcd"所对应的字符串对象的地址,所以最后的结果为false
总共有4个对象吧,str1,str2,str3,"abcd"

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如上所说,4个对象啊。肯定在堆栈里,都是按创建顺序排放的。
运用结果 肯定是false啊
比较字符串 用 equals

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

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