黑马程序员技术交流社区

标题: String s = “a”+“b”+”c”+”d” [打印本页]

作者: xiaoya0o0o    时间: 2015-9-18 18:12
标题: String s = “a”+“b”+”c”+”d”
3、下面这条语句一共创建了多少个对象:String s = “a”+“b”+”c”+”d”; 为什么?
答案:
对于如下代码:
     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。

作者: boboyuwu    时间: 2015-9-18 19:31
这个问题值得详细的解释一下  String s = “a”+“b”+”c”+”d”;   新手潜意识看见有4个字符串会感觉创建了4个对象,其实“a”+“b”+”c”+”d”运算时会先将字符串拼接之后再放到常量池中,也就是说系统先把“a”+“b”+”c”+”d“拼接成”abcd“之后才在常量池中创建一个对象把”abcd“放进去而不是先一个个的在常量池中创建对象之后再计算,所以常量池中有一个对象存放"abcd"   s=="abcd"当然是true了。

下面这个情况: String s1="a";
                        String s2="b";
                        String s3=s1+s2;;
               这种情况跟上面的恰恰想反,这种就是创建了2个对象,里面分别存放字符串"a"和字符串"b",然后2个对象相加,地址进行了运算。
作者: Wqi    时间: 2015-9-18 19:41
常量优化机制
作者: 菜鸟征程    时间: 2015-9-18 22:57
过来看看

作者: xuxu5112    时间: 2015-9-18 23:48
本来弄懂了后来又晕了,是不是 =后边不带 索引的才能用常量池呢???求解答




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