黑马程序员技术交流社区

标题: 创建对象 [打印本页]

作者: 汪龙    时间: 2014-4-14 12:28
标题: 创建对象
下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

作者: 黄晓鑫    时间: 2014-4-14 12:35
5个 a b c d s
作者: 周建岐    时间: 2014-4-14 12:39
一个 "abcd"
作者: qiubaoyang    时间: 2014-4-14 12:49
答:对于如下代码:
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对象。
写如下两行代码,
           Strings = "a" + "b" + "c" + "d";
           System.out.println(s== "abcd");
最终打印的结果应该为true。


作者: 沫然    时间: 2014-4-14 15:58
就创建了一个
String s = "a" + "b" + "c" + "d"";
赋值符号右边的"a"、"b"、"c"、"d"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcd"
该语句在class文件中就相当于String s = "abcd"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个
但是你如果是变量的话就会每次都创建一个,这种情况下最好用
StringBuilder。
你可以参考一下:
StringBuilder builder = new StringBuilder();
builder.append(a);
builder.append(b);
String s = builder.toString();




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