黑马程序员技术交流社区

标题: 请问String str = "ab"+"cd";创建几个对象? [打印本页]

作者: 安卓菜鸟    时间: 2014-9-25 16:53
标题: 请问String str = "ab"+"cd";创建几个对象?
请问String str = "ab"+"cd";这句代码创建几个对象?在网上查到两个答案1个和3个,不知道哪个是正确的,求帮助,谢谢!
作者: 程序员_R    时间: 2014-9-25 17:02
额,创建了一个。
作者: liaorubei    时间: 2014-9-25 17:33
创建了一个对象,并且是一个常量,即字符串"abcd",因为编译的时候直接把这两个字符串连接起来了,所以只有一个对象,
变量str引用的就是这个常量的地址
作者: sean    时间: 2014-9-25 18:18
楼上正解,加号只是将两边的字符串连接起来,所以是一个对象
作者: a986875894    时间: 2014-9-25 22:31
String str = "ab"+"cd" 字符串ab在堆创建一个对象,字符串cd也在堆里创建个对象,然后两个对象组合在一起又是一个对象 个人认为三个都在堆内存中 所以是三个,因为字符串创建了就不能改变  String是不可变序列,如果用StringBuffer才是一个对象,因为StringBuffer才是可变的序列,个人浅见,不对请指教:D
作者: 不喜欢么    时间: 2014-9-25 23:04
建了一个对象
作者: 黑马童宇    时间: 2014-9-25 23:44
对于这个问题,当然只创建了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";这种情况,对字符串进行赋值时,如果右操作数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用

作者: wangpengyong    时间: 2014-9-26 12:10
是的  只创建一个对象
作者: 郑飞    时间: 2014-9-27 10:44
黑马童宇 发表于 2014-9-25 23:44
对于这个问题,当然只创建了1个对象,要分析String str = "ab"+"cd";这条语句创建几个对象,就要考虑java的 ...

"ab" "cd"不是创建的 那是怎么来的啊
作者: ______雨点ペ    时间: 2014-9-27 11:30
三个对象。字符串""本身就是一个引用类型的对象。所以"ab"是一个,"cd"是一个,然后+作字符串连接后,"abcd"又是一个;总共三个
作者: 谢建平    时间: 2014-9-27 15:28
如果常量池有  我说一个都不创建
作者: EDDY_Liang    时间: 2014-9-27 15:49
我也觉得是3个对象,编译器应该是验证语法是否正确,怎么会把右边的两个字符串先连起来呢??
+  可是运算符啊
作者: 黑马童宇    时间: 2014-9-27 22:19
郑飞 发表于 2014-9-27 10:44
"ab" "cd"不是创建的 那是怎么来的啊

接写"ab"和"cd"时会直接到字符串池中寻找,而字符串池中是有"ab"和"cd"的,所以"ab"和"cd"不会创建对象。。。跟new String("ab");和new String("cd");最大的不同就是后者是在开辟内存在堆中建立对象。
作者: 郑飞    时间: 2014-9-27 22:37
黑马童宇 发表于 2014-9-27 22:19
接写"ab"和"cd"时会直接到字符串池中寻找,而字符串池中是有"ab"和"cd"的,所以"ab"和"cd"不会创建对象。 ...

那我们能不能知道 字符串池中到底装了哪些字符串啊 "a" "ab" "abc"  "aaaaa........." 总要有个限度啊 有没相关的资料
作者: noiary    时间: 2014-9-27 23:12
是个好问题!
作者: 安少康    时间: 2014-9-27 23:42
1个,,string创建了就不能变了,需要变的话Stringbulider。
作者: 菜鸟一号    时间: 2014-9-28 09:08
讨论得好激烈,请教师看见了点评:lol
作者: 黑马童宇    时间: 2014-9-28 19:48
郑飞 发表于 2014-9-27 22:37
那我们能不能知道 字符串池中到底装了哪些字符串啊 "a" "ab" "abc"  "aaaaa........." 总要有个限度啊 有 ...

看sun公司的原版英文文档
作者: rel4x    时间: 2014-9-28 19:53
学习啦。。。。

作者: xuanguofeng    时间: 2014-9-28 21:10
感觉应该是三个对象,str是一个 还有2个引号创建的。这个很像经常问到的一个面试题
String s=new String("xyz");创建了几个对象,
这个应该创建2个对象一个在堆去一个在字符串池。一个是xyz 一个是只想xyz的引用对象s,而楼主的题应该是三个对象"ab"和"cd"是2个对




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