黑马程序员技术交流社区

标题: String [打印本页]

作者: .Mr    时间: 2013-12-21 14:34
标题: String
本帖最后由 .Mr 于 2013-12-22 16:34 编辑

对于如下代码:
为什么结果是这样的?
String s1 = "a";
String s2 = s1+"b";
String s3 = "a"+"b";
System.out.println("s2=="ab");  //false
System.out.println("s3=="ab");  //true

引出的这条语句一共创建了多少个对象:String s= "a"+“b”+“c”+“d”;
作者: 四五六七八    时间: 2013-12-21 16:31
本帖最后由 四五六七八 于 2013-12-21 16:36 编辑

String s1 = "a";               在String池中创建
String s2 = s1+"b";          在程序执行时创建  即 在s2堆里面   
String s3 = "a"+"b";           在编译期创。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的                                           编译器会直接将字面值处理好之后 再在String池中创建  ab
String s="a"+"b"+"c"+'d"        只创建一个字符串  abcd

作者: 刘松703    时间: 2013-12-21 16:59
http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
这里有一篇博文,你看看,应该对你有帮助,我觉得写的不错。关于==和equals的区别,你的问题里面也讲了
作者: 呆呆呆    时间: 2013-12-21 17:08
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对
字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,
而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,
所以,上面的代码应该只创建了一个String对象。写如下两行代码,
  1. String s ="a" + "b" + "c" + "d";
  2. System.out.println(s== "abcd");
复制代码
最终打印的结果应该为 true





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