解决方案 »

  1.   

    编译器的优化:
    String s1 = "a";
    String s2 = s1 + "b";  //编译后s2=StringBuilder.append("a").append("a").toString();
    String s3 = "a" + "b";  //编译后s3="ab";
      

  2.   

    那为什么System.out.println(s2 == "ab");是false啊
      

  3.   

    那为什么System.out.println(s2 == "ab");是false啊
    String s1 = "a";
     String s2 = s1 + "b";  //编译后s2=new StringBuilder.append("a").append("a").toString();,这是在对上分配s2引用的是堆上的"ab"
     String s3 = "a" + "b";  //编译后s3="ab",在常量池,s3引用的常量池的"ab";
      

  4.   

    打错字了。
    String s1 = "a";
      String s2 = s1 + "b";  //编译后s2=new StringBuilder.append("a").append("b").toString();,这是在堆上分配,s2引用的是堆上的"ab"
      String s3 = "a" + "b";  //编译后s3="ab",在常量池,s3引用的常量池的"ab"; 
      

  5.   

    嗯。
    S1和S3都放在常量池,在编译的时候就存在class文件中。
    S2要在运行时是才能读出来。
      

  6.   

    这个得从内存的角度考虑。ab这个字符串第一次出现时,String池中是没有这个东东的,接下来被加载到String池中,s3就在这里找到。所以结果是false和true。