现在的位置: 首页 > 综合 > 正文

共创建了多少个对象:String s=”a”+”b”+”c”+”d”;

2014年02月15日 ⁄ 综合 ⁄ 共 896字 ⁄ 字号 评论关闭
 
          String s1 = "a";
	  String s2 = s1 + "b";
	  String s3 = "a" + "b";
	  System.out.println(s2 == "ab");
	  System.out.println(s3 == "ab");

	  String s = "a" + "b" + "c" + "d";
	  System.out.println(s == "abcd");
javac 编译后:
 
        String s1 = "a";
        String s2 = (new StringBuilder(String.valueOf(s1))).append("b").toString();
        String s3 = "ab";
        System.out.println(s2 == "ab");
        System.out.println(s3 == "ab");
        String s = "abcd";
        System.out.println(s == "abcd");
 java run执行后:
false
true
true

第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。

写如下两行代码,String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd");最终打印的结果应该为true。

 

 -------------------------------分割线-----------------------------------

另外还有String的字符串池,如果池子里有了该常量,就不去new了直接共享,如果没有就到堆中new。

介绍一个工具Jad.exe 把javac 后的class编译出来 看看编译器给我们做了什么,可以在这里找出错原因。

如果大家有幸学过编译原理那就最好了,linux下shell开发有时候还要写makefile,很明了的知道一个个程序怎么个变成可执行的文件。

抱歉!评论已关闭.