A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© .Mr 中级黑马   /  2013-12-21 14:34  /  1653 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 .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”;

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 四五六七八 于 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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马