黑马程序员技术交流社区

标题: 下面这条语句一共创建了多少个对象 [打印本页]

作者: 鸭梨的生活    时间: 2014-5-18 21:01
标题: 下面这条语句一共创建了多少个对象
下面这条语句一共创建了多少个对象:Strings="a"+"b"+"c"+"d";.

作者: 张斌    时间: 2014-5-18 21:43
一个对象,+ 只是字符串相连接
作者: 张斌    时间: 2014-5-18 21:50
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
           String s ="a" + "b" + "c" + "d";
           System.out.println(s== "abcd");

作者: osully    时间: 2014-5-18 21:59
n个对象吧
a
b
c
d
ab
ac
ad
.....
abc
......
abcd
作者: leo_lzj    时间: 2014-5-18 22:04
双引号里内容表示字符串,一个双引号就建立了一个String对象,就有了4个;
"a"+"b"=“ab”一个;"ab"+"c"=“abc”一个;"abc"+"d"=“abcd”一个,这里有三个;
最后赋值给s的是最后执行完"a" + "b" + "c" + "d"之后的结果,即“abcd”;
因此,这句话在内存中应该是建立了4+3=7个对象。
作者: liang090214    时间: 2014-5-18 22:41
String s = “a”+”b”+”c”; //创建了5个对象
String s = “a”+”b”+”c”+”d”; //创建了7个对象
String s = “a”+”b”+”c”+”d”+”e”; //创建了9个对象
String s = “a”+”b”+”c”+”d”+”e”+”f”; //创建了11个对象
注: String是一个不可变的字符序列,每次字符相加操作都会有新的对象形成。
作者: tc4892998    时间: 2014-5-18 23:01
学习了..
作者: 小小6456    时间: 2014-5-18 23:25
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
           String s ="a" + "b" + "c" + "d";
           System.out.println(s== "abcd");
最终打印的结果应该为true。
作者: 彭飞    时间: 2014-5-19 00:17
兄兄,我的认识里是这样的:

String s="a"+"b"+"c"+"d";.  //  创建 4个
String s="ab"+"c"+"d";//创建 1个
String s="abc"+"d";//创建 1个
String s="abcd";//创建 1个

所以一开始到最后一共创建了7个对象



作者: 奇迹    时间: 2014-5-19 00:24
好蛋疼的问题啊,有什么意义吗
作者: ID1003    时间: 2014-5-19 00:49
:o学习了
作者: alax    时间: 2014-5-19 05:31
好像是创建一个对象吧
作者: 张鹏宇    时间: 2014-5-19 12:10
张斌 发表于 2014-5-18 21:50
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";

正解。。。
作者: 雨落千木的时节    时间: 2014-5-19 12:27
"+"表示连接,您这样写最终的结果为abcd,其实创建了一个对象!
作者: 铁血丹心    时间: 2014-5-19 12:49
张斌 发表于 2014-5-18 21:50
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";

为什么第一行输出时false啊,s2不指向"ab"那它指向什么地方?
作者: 无奈的我+.l    时间: 2014-5-20 13:37
长见识了
作者: 947415283    时间: 2014-5-20 14:57
就是一个对象
作者: 136616244    时间: 2014-5-20 16:57
先进行右边的运算,在将运算后的结果赋值引用变量s,s只指向了一个对象即”abcd“,
作者: amao    时间: 2014-5-21 00:37
看代码:
String s1 = "a"+"b"+"c"+"d";
String s2 = "abcd";
System.out.println(s1==s2);
亲测结果为true。
因为s2只创建了一个对象,所以s1也只创建了一个对象。
作者: yinxjfly    时间: 2014-5-25 14:14
内存中创建s的时候会创建多个字符串对象(),但编译运行后内存中只存在一个对象,剩下的被GC回收了!

作者: Porsche911    时间: 2014-5-25 15:12
String类的定义就知道,只要被双引号括起来的部分那就是一个String类的实例对象!因此确实在内存常量池中的字符串池中存在7个对象,只是说类型型变量s仅仅指向了一个对象"abcd"而已。

至于说,20楼提到的垃圾回收的问题,我就不太清楚了,但我感觉常量池里的对象应该不会被垃圾回收。。。
作者: ↘ふ紫铯幽夢    时间: 2014-5-25 15:27
本帖最后由 ↘ふ紫铯幽夢 于 2014-5-25 15:34 编辑

   //这是我的分析,请看注释


  1. String s1="a"+"b"+"c";
  2. String s2="a"+("b"+"c");//如果按照会创建多个对象来理解,该行代码会先创建b+c的对象再和c想加返回一个全新的对象,按照这个逻辑推断s1==s2应该返回false,但实际返回true。与会创建多个对象相违背。 String s1="a"+"b"+"c";因此我认为 String s1="a"+"b"+"c"该行代码只会创建一个对象。
  3. System.out.println(s1==s2);//返回了true
复制代码

作者: Blackay    时间: 2014-5-25 16:51
看了评论 我已然不知道到底是几个了~
作者: 锋少    时间: 2014-6-4 12:39
只创建一个对象,在常量池中
作者: Blüe-wǒlf    时间: 2014-6-4 13:19
liang090214 发表于 2014-5-18 22:41
String s = “a”+”b”+”c”; //创建了5个对象
String s = “a”+”b”+”c”+”d”; //创建了7个对象
St ...

好棒!!!!!!!




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