黑马程序员技术交流社区

标题: String s="a"+"b"+"c"+"d"创建了几个对象 [打印本页]

作者: 杨庆雷    时间: 2014-8-13 20:55
标题: String s="a"+"b"+"c"+"d"创建了几个对象
本帖最后由 杨庆雷 于 2014-8-13 23:43 编辑

我们已经知道了 String str = new String("abc");是创建了两个对象
1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
2,StringBuilder sb = new StringBuilder();
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String s = a+b+c+d;  这句话创建了几个对象
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").append("d");这句话创建了几个对象

-------------------------------------------------------------------------------------------
答案是  7   3    0

第一题:“a”“b”“c”“d” “ab”“abc”“abcd”
第二题: “ab”“abc”“abcd”
第三题:因为a”“b”“c”“d”在串池中已经存在,不会创建对象,并且StringBuilder添加字符串的时候跟String
是不一样的,StringBuilder是不会创建对象的(所以说我们在增加字符串长度的时候尽量用StringBuilder,这样会少创建对象,节省资源,提高效率)
所以是0个对象

作者: 不可言    时间: 2014-8-13 21:32
等你把答案写出来再告诉你
作者: 李章敏    时间: 2014-8-13 21:34
坐等答案                                                                              
作者: 象牙    时间: 2014-8-13 21:40
1.String s="a"+"b"+"c"+"d"创建了几个对象  创建了7个对象
作者: 晓风    时间: 2014-8-13 21:46
创建了5个对象。
作者: 象牙    时间: 2014-8-13 21:47
象牙 发表于 2014-8-13 21:40
1.String s="a"+"b"+"c"+"d"创建了几个对象  创建了7个对象

貌似这是有问题的,求高手解释
作者: icris    时间: 2014-8-13 21:55
String s="a"+"b"+"c"+"d" 这句的运算部分在编译时就完成了,运行时只有一个 "abcd" 对象
String s = a+b+c+d;  这句有 "ab", "abc", "abcd" 三个
sb.append("a").append("b").append("c").append("d"); 有 "a", "b", "c", "d" 四个字符串对象
如果中间的换成 sb.append(a).append(b).append(c).append(d); 不创建新对象
作者: zc62343    时间: 2014-8-13 21:56
创建了一个对象
作者: Franklin    时间: 2014-8-13 22:36
等着答案
作者: inception    时间: 2014-8-13 22:54
看看,,,。。。。
作者: 何艳梅    时间: 2014-8-13 22:55
坐等答案      
作者: ZYcoc0    时间: 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚学基础视频,不喜勿喷。
我是这样理解的,String str 是在栈内存开辟空间,指向堆内存里new String("abc")这个对象,不应该只有一个对象么?~
作者: 单曲循环    时间: 2014-8-13 23:18
坐等答案
作者: 李煜    时间: 2014-8-13 23:25
学到了 不过问题好像满刁钻的
作者: 李煜    时间: 2014-8-13 23:27
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚 ...

我也是这么想的 怎么就2个了?:o
作者: icris    时间: 2014-8-13 23:29
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚 ...

在 new String("abc") 之前,要有一个 "abc" 对象作为参数传进来啊,这个参数不可能是它自己啊
作者: 小乖乖灬浩歌    时间: 2014-8-13 23:38
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚 ...

字符串本身会将出现的像“s”这样字符串常量放到常量池里面 具体位置好像在方法区 new String("a")的实质就是栈内存中得对象存放的是方法区常量池对应常量的地址
作者: David.L    时间: 2014-8-13 23:42
什么时候要数对象?
作者: nadax    时间: 2014-8-13 23:44
我觉得应该是5个吧。因为每NEW一次会开辟一个新的内存空间,求大神指点。
作者: 象牙    时间: 2014-8-13 23:56
1, String s="a"+"b"+"c"+"d"创建了几个对象   创建了一个对象
作者: 杨庆雷    时间: 2014-8-13 23:58
David.L 发表于 2014-8-13 23:42
什么时候要数对象?

比如说我们接收到了100W条字符串(不要觉得不可能),需要把他们合成一个字符串,你会怎么办?你会用String还是StringBuilder,你如果不知道上面这个帖子的原理  你就只能蒙一个方法,而蒙错的结果就是:你的程序效率会很低。
作者: liqi    时间: 2014-8-14 00:01
坐等答案
作者: 碎流    时间: 2014-8-14 00:02
学习了....                          
作者: Bule丶    时间: 2014-8-14 00:04
神级啊,学习了
作者: icris    时间: 2014-8-14 00:12
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释两个 StringBuilder sb = new StringBuilder(); ?
作者: 杨庆雷    时间: 2014-8-14 00:21
icris 发表于 2014-8-14 00:12
原来真的有答案…
第一题是错的,只有一个,编译器就是干这个的
第三题看你的意思是跟2连着的,你怎么解释 ...

最后是只存在一个 但是过程中确创建了7个 ,“a”“b““c”不会凭空而来   其他的没有引用的指向,被收回
作者: icris    时间: 2014-8-14 00:25
杨庆雷 发表于 2014-8-14 00:21
最后是只存在一个 但是过程中确创建了7个 ,“a”“b““c”不会凭空而来   其他的没有引用的指向,被收 ...

编译和运行是两个分开的过程
作者: 我行我SHOW‰    时间: 2014-8-14 00:29
坐等大神回复。。。。。
作者: 单线程xia    时间: 2014-8-14 01:07
过程中应该是7个。求大神公布正确答案
作者: huocaoxi    时间: 2014-8-14 03:12
第一题怎么会有七个对象
作者: 小糊涂神    时间: 2014-8-14 07:54
ZYcoc0 发表于 2014-8-13 23:15
我们已经知道了 String str = new String("abc");是创建了两个对象

这句话为啥和我理解的不一样呢?  我刚 ...

abc就是一个,然后new又弄了个
作者: 阿磊    时间: 2014-8-14 08:13
学习行学习
作者: 王广丛    时间: 2014-8-14 09:36
最近看到许多类似的帖子,大致意思如下:

问题1: String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,

答案是
就创建了一个
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个


问题2:但是如果改成 String s = a+b+c+d+e;
呢 又是几个了。

就是说上面是一个是因为 "a"、"b"、"c"、"d"、"e"都是常量
但如果是变量呢?



我的答案是3个对象,但只有一个String对象:

由于编译器的优化,最终代码为通过StringBuilder完成:

具体解释请参考http://blog.csdn.net/wgc461749883/article/details/38553787
作者: 微微微笑    时间: 2014-8-14 10:04
第一个应该是一个吧?不解?
作者: 木易在他乡    时间: 2014-8-14 10:25
icris 发表于 2014-8-13 21:55
String s="a"+"b"+"c"+"d" 这句的运算部分在编译时就完成了,运行时只有一个 "abcd" 对象
String s = a+b+c ...

StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个对象的.
作者: THE_FUTURE    时间: 2014-8-14 10:49
String s="a"+"b"+"c"+"d"  创建了一个对象。等同于 String s=new String("a"+"b"+"c"+"d")
只占用一个堆地址空间
作者: icris    时间: 2014-8-14 12:19
木易在他乡 发表于 2014-8-14 10:25
StringBuilder在连接新的字符串时,会根据自身capacity扩容所以不用在新建对象;但是在创建时,是要建立一个 ...

创建不在那一句不是不算吗
作者: justin1258    时间: 2014-8-14 13:31
第一题:应该只有1个“abcd”,被编译器优化成:String s=“abcd”了;
第二题:如果不考虑之前的字符串池,创建的有5个:"a","b","c","d"和"abcd"。String s = a+b+c+d;等价于:String s = new StringBuilder().append("a").append("b").append("c").append("d").toString();
第三题按楼主这么考虑应该是对的。
楼主可以查看编译后的字节码。
作者: 木易在他乡    时间: 2014-8-18 10:53
第一:"a"+"b"+"c"+"d",的方式,过程中不用建对象,所以就一个最终对象;
第二:String s = a+b+c+d的方式,过程中要建对象,虽然运行后释放,所以楼主说的是编译过程还是运行后?我想大家都可以数出来吧.
同意的点支持,求斑竹分哈
作者: Caincxy    时间: 2014-8-18 13:38
来学习的




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