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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄树人 中级黑马   /  2012-9-21 23:42  /  1427 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄树人 于 2012-9-22 18:40 编辑

对于如下代码:
     String s1 = "a";

     String s2 = s1 + "b";

     String s3 = "a" + "b";

    String s = "a" + "b" + "c" + "d";

     System.out.println(s2 == "ab");

     System.out.println(s3 == "ab");

    System.out.println(s == "abcd");
这断代码在运行时,打印的是false true true
代码创建S1对象把字符串“a”赋值给了S1,然后把S1和“b”共同组成的字符串赋值给了S2
s1和s2代码的值都是“ab”啊,按理第一个输出语句应该也答应true啊,可为什么打印出了false呢
还有这段代码中一共创建了多少个对象呢?

4 个回复

倒序浏览
s1,s2,s3,s各自有一个对象所以是四个对象。
==是地址比较,equals是值比较 。
因为他们的值是相同的,但是他们的物理地址不同,不是一个对象,并不能认为是完全的相等(“==”)。
java中字符串比较推荐用equals,例如s2.equals("ab") 。
所以打印的是false true true
回复 使用道具 举报
==,比较的是地址值,“a”+“b”=="ab",如果已有字符串对象“a”+“b”了,在创建字符串对象“ab”,他俩的地址值是一样的,也就是说内存中只有一个对象,节省资源。

String s1="abc";
String s2="abc";
System.out.println(s1==s1);//true
所以后两个是true,true

String s1="a";
String s2=s1+"bc";
String s3="abc";
System.out.println(s2==s3);//false
看看视频,毕老师视频String那开头讲过
回复 使用道具 举报
对于如下代码:
    String s1 = "a";

     String s2 = s1 + "b";

     String s3 = "a" + "b";

    String s = "a" + "b" + "c" + "d";

     System.out.println(s2 == "ab");

     System.out.println(s3 == "ab");

    System.out.println(s == "abcd");

第一条语句打印的结果为false,第二条语句打印的结果为true,第三条语句打印的结果是true,这说明JVM可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果
回复 使用道具 举报
String s1 = "a";

     String s2 = s1 + "b";//此时s2并不知道s1会赋予什么值,是个未知的。他只是将引用付给了s2     String s3 = "a" + "b";//其实s3="ab";你这样的写法,就是java虚拟机在识别的时候,直接给操作了
    String s = "a" + "b" + "c" + "d";//同上原理

     System.out.println(s2 == "ab");//所以是false

     System.out.println(s3 == "ab");//true

    System.out.println(s == "abcd");//true
这个情况在张孝祥老师的基础加强里面提及到过,你可以再看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马