哥们今天去公司的笔试题 是这个问题
但是没有答对,所以去网上搜了一下 但是结果回答的各种各样 求权威答案啊  谢谢。。
==============下面是我搜到的一些答案=========不知道哪个对啊========
NO1.(我看不懂这个答案什么意思)
下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
答:对于如下代码:
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。 N02.
一共9个对象 java中String 每个引号都是一个对象  这就是5个了
"a"+"b"=ab一个
"ab"+"c"=abc
"abc"+"d"=abcd
"abcd"+"e"=abcde
这又是4个一共有9个虽然s只是指向最后一个 但是实际上产生了9个对象N03.
这不误人子弟嘛,就两个对象,对于基本类型在编译期就确定了值,在字符串池中就一个对象“abcde”,这行代码相当于string s = "abcde";所以一共创建了2个对象

解决方案 »

  1.   

    错了,NO1中“上面的代码应该只创建了一个String对象”这一句错了。其实是两个对象,一个是“abcde”,另一个是a
      

  2.   

    周经啊,这个事情就不要纠结了,不同的编译器结果都不一样,现在的编译器已经非常智能了:下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";后面的"a"+"b"+"c"+"d",编译器直接就会把它合并掉。看实例:public class OneString {
        public static void main(String[] args) {
            String s="a"+"b"+"c"+"d";
        }
    }
    反编译class的ByteCode
    // Compiled from OneString.java (version 1.6 : 50.0, super bit)
    public class OneString {
      
      // Method descriptor #6 ()V
      // Stack: 1, Locals: 1
      public OneString();
        0  aload_0 [this]
        1  invokespecial java.lang.Object() [8]
        4  return
          Line numbers:
            [pc: 0, line: 1]
          Local variable table:
            [pc: 0, pc: 5] local: this index: 0 type: OneString
      
      // Method descriptor #15 ([Ljava/lang/String;)V
      // Stack: 1, Locals: 2
      public static void main(java.lang.String[] args);
        0  ldc <String "abcd"> [16]