thefansofjay
thefansofjay
采纳率61.9%
2015-12-02 13:48

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

1

答:对于如下代码:
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对象。写如下两行代码,
String s ="a" + "b" + "c" + "d";
System.out.println(s== "abcd");
最终打印的结果应该为true。

这是JAVA面试题及答案,但不十分理解,谁能帮我解释一下,System.out.println(s2 == "ab");为什么返回false?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答

  • lixiangming_10010 sea-lavender 6年前

    记好了 String 相当于final型的。实力化后是定常的,再➕的话 会重新创建String的

    点赞 2 评论 复制链接分享
  • qq_25207265 Java小伙初入 6年前

    从String作为对象理解下,==比较的是对象的地址,equals比较的才是对象的内容,在变量+字面量会生成新的对象

    点赞 1 评论 复制链接分享
  • lb1120890227 lb1120890227 6年前

    栈内存中存放引用变量--S1,S2和S3,堆内存中存放的是对象--a,b,c和d;
    String s2 = s1 + "b",
    理解为引用地址和堆地址的联合;
    String s3 = "a" + "b",
    理解为堆地址和堆地址的联合,即堆中“ab”的地址,
    所以S2=“ab”为false;

    点赞 1 评论 复制链接分享
  • qq_25523095 十尾晴天 3年前

    为什么 s2 == "ab" “ab”是一个存放在常量池中的常量, s2 = s1 + "b" 因为String是final型的,任何对String的修改都会重新创建一个String对象,
    所以s2是一个存放在堆内存的对象,==操作不仅判断值是否相等,还判断是否是同一个引用(即是否是同一个对象),这里s2和"ab"显然不是同一个对象
    所以为false

    点赞 评论 复制链接分享
  • netoT netoT 6年前

    一共创建了3个对象s1,s2,s3

    点赞 评论 复制链接分享