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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

安卓菜鸟

初级黑马

  • 黑马币:21

  • 帖子:9

  • 精华:0

© 安卓菜鸟 初级黑马   /  2014-9-25 16:53  /  4932 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问String str = "ab"+"cd";这句代码创建几个对象?在网上查到两个答案1个和3个,不知道哪个是正确的,求帮助,谢谢!

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 加油哦

查看全部评分

19 个回复

正序浏览
感觉应该是三个对象,str是一个 还有2个引号创建的。这个很像经常问到的一个面试题
String s=new String("xyz");创建了几个对象,
这个应该创建2个对象一个在堆去一个在字符串池。一个是xyz 一个是只想xyz的引用对象s,而楼主的题应该是三个对象"ab"和"cd"是2个对
回复 使用道具 举报
rel4x 中级黑马 2014-9-28 19:53:55
19#
学习啦。。。。
回复 使用道具 举报
郑飞 发表于 2014-9-27 22:37
那我们能不能知道 字符串池中到底装了哪些字符串啊 "a" "ab" "abc"  "aaaaa........." 总要有个限度啊 有 ...

看sun公司的原版英文文档
回复 使用道具 举报
讨论得好激烈,请教师看见了点评:lol
回复 使用道具 举报
1个,,string创建了就不能变了,需要变的话Stringbulider。
回复 使用道具 举报
是个好问题!
回复 使用道具 举报
黑马童宇 发表于 2014-9-27 22:19
接写"ab"和"cd"时会直接到字符串池中寻找,而字符串池中是有"ab"和"cd"的,所以"ab"和"cd"不会创建对象。 ...

那我们能不能知道 字符串池中到底装了哪些字符串啊 "a" "ab" "abc"  "aaaaa........." 总要有个限度啊 有没相关的资料
回复 使用道具 举报
郑飞 发表于 2014-9-27 10:44
"ab" "cd"不是创建的 那是怎么来的啊

接写"ab"和"cd"时会直接到字符串池中寻找,而字符串池中是有"ab"和"cd"的,所以"ab"和"cd"不会创建对象。。。跟new String("ab");和new String("cd");最大的不同就是后者是在开辟内存在堆中建立对象。
回复 使用道具 举报
我也觉得是3个对象,编译器应该是验证语法是否正确,怎么会把右边的两个字符串先连起来呢??
+  可是运算符啊
回复 使用道具 举报
如果常量池有  我说一个都不创建
回复 使用道具 举报
三个对象。字符串""本身就是一个引用类型的对象。所以"ab"是一个,"cd"是一个,然后+作字符串连接后,"abcd"又是一个;总共三个
回复 使用道具 举报
郑飞 高级黑马 2014-9-27 10:44:33
9#
黑马童宇 发表于 2014-9-25 23:44
对于这个问题,当然只创建了1个对象,要分析String str = "ab"+"cd";这条语句创建几个对象,就要考虑java的 ...

"ab" "cd"不是创建的 那是怎么来的啊
回复 使用道具 举报
是的  只创建一个对象
回复 使用道具 举报
对于这个问题,当然只创建了1个对象,要分析String str = "ab"+"cd";这条语句创建几个对象,就要考虑java的内存分配,对字符串来"ab"和"cd"来说,他们都是存在于堆内存中的字符串池中,字符串池是堆内存中的一个特殊区域,当"ab"和"cd"之间用加号连接起来时,会分别在字符串池中找到"ab","cd",此时不创建对象,而是直接在字符串池中进行拼接形成字符串"abcd",由于java中一切皆为对象,将str指向字符串池中的"abcd"看成对象,也就是只创建了一个对象。
若为下面这种情况,则创建了2个对象:
String str1 = new String("ab");  //"ab"在堆内存中
String str2 = str1 + "cd";           //"cd"存在于字符串池中
对于上面String str2 = str1 + "cd";这种情况,对字符串进行赋值时,如果右操作数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用
回复 使用道具 举报
建了一个对象
回复 使用道具 举报
String str = "ab"+"cd" 字符串ab在堆创建一个对象,字符串cd也在堆里创建个对象,然后两个对象组合在一起又是一个对象 个人认为三个都在堆内存中 所以是三个,因为字符串创建了就不能改变  String是不可变序列,如果用StringBuffer才是一个对象,因为StringBuffer才是可变的序列,个人浅见,不对请指教:D
回复 使用道具 举报
楼上正解,加号只是将两边的字符串连接起来,所以是一个对象
回复 使用道具 举报
创建了一个对象,并且是一个常量,即字符串"abcd",因为编译的时候直接把这两个字符串连接起来了,所以只有一个对象,
变量str引用的就是这个常量的地址
回复 使用道具 举报
额,创建了一个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马