String s = "a" + "b" + "c" + "d" + "e";此句代码从头至尾共创建了几个对象,
在其他论坛看到的这个帖子,众说纷纭啊,我等菜鸟被彻底搞迷糊了,还是来CSDN鉴定清楚
下面是那个帖子里的2个说发:
1。就创建了一个 
  String s = "a" + "b" + "c" + "d" + "e"; 
  赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量 
  对于常量,编译时就直接存储它们的字面值而不是它们的引用 
  在编译时就直接讲它们连接的结果提取出来变成了"abcde" 
  该语句在class文件中就相当于String s = "abcde" 
  然后当JVM执行到这一句的时候, 就在String pool里找 
  如果没有这个字符串,就会产生一个

2.9个对象 
分析如下: 
String s只是一个对右边对象的引用不是对象,它引用的是右边表达式最后形成的对象,即"abcd" 再看右边 首先明确一点 
String str=”aaa“; 
上边的语句产生了一个对象 
即右边是以双引号形式产生了一个String对象 此种形式的对象被存储在字符串池当中 
题中右边的试子是以一下顺序来创建对象的 
"a" 查找字符串池里没有与此字符串equal的字符串对象(注意是equal不是==)于是创建对象"a" 
接着 "b" 同上 也在字符串池里创建对象"b" 接着 "a"+"b" 即 "ab" 同样 在字符串池里找不到equal的对象于是创建字符串池中对象"ab" 以此类推 产生9个对象 都存储在字符串池当中 分别是 
"a" 
"b" 
"ab" 
"c" 
"abc" 
"d" 
"abcd" 
"e" 
"abcde" 
个人比较倾向于第二个回答

解决方案 »

  1.   

    String s = "a" + "b" + "c" + "d" + "e";正确答案:1个
    "a" + "b" + "c" + "d" + "e" 这些在加载时都被放在一个字符串池里
      

  2.   

    1正确,over。
    不信的话去查java语言规范。
      

  3.   

    那意思就是只有基本类型才会放到池中去咯?
    String s="ab"+"cd"+"ef"
    像这种非基本类型是不是就是第二种说法这种情况了,生成了5个对象?
      

  4.   

    动手写一下,然后反编译生成的class文件,就会发现代码变了,只有一个对象
      

  5.   

    原始代码
    String s = "a" + "b" + "c" + "d" + "e";编译后再反编译的代码
    String s = "abcde";
      

  6.   

    结果是只创建了一个对象;
    过程中创建了五个StringBuffer
    调用了StringBuffer的append()方法;
    楼主查一下String 和StringBuffer的区别
      

  7.   

    昨天晚上去javap了下,在JDK1.6版本下,上面的过程是实例化一个StringBuilder然后,append其他,所以个人觉得,说一个应该是实例对象StringBuilder!引用对象有几个就不知道了
      

  8.   


    使用反java反编译工具,工具有很多,自己下吧,一般小于一MB
      

  9.   

    产生一个对象。查看一下《thinking in java》就行啦。
      

  10.   

    public class string{
    String s = "a" + "b" + "c" + "d" + "e";
    }编译下上边的语句,然后再反编译下,如下:
    // Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
    // Jad home page: http://kpdus.tripod.com/jad.html
    // Decompiler options: packimports(3) fieldsfirst ansi space 
    // Source File Name:   string.java
    public class string
    { String s; public string()
    {
    s = "abcde";
    }
    }
      

  11.   

    如果笔试时遇到这道题,直接回答:
    这个问题比较屎!为什么?在Java里你只需要知道对象和对象应用就可以将一切java程序交代了!计较几个String对象的公司都是吃饱了 撑得!鉴定完毕!
      

  12.   

    one个 这也快成超级无敌月经贴了
      

  13.   

    在eclipse中用debug调试看下结果就知道了,
    这种语法知识个人感觉很无聊,只能考试用...
      

  14.   

    这样连接字符只有一个对象,如果是用StringBuffer里的append方法追加字符的话,就要生成多个对象了
      

  15.   

    答案是1个没错啦,不过说String是基本数据类型我可不同意。
      

  16.   

    String 对象的问题为什么永远问不腻?这要归功于 Thinking in Java 这本天书!
      

  17.   

    JAVA不是完全面向对象吗我感觉应该第2个对啊。。字符串每一个不久是一个对象吗,糊涂了。。
      

  18.   

    《Java编程思想》原来就是这个原因被牛人封杀的啊
      

  19.   

    Effective Java也有类似的意思:
    比如用String str = "hello";而不是
    String str = new String("hello");
      

  20.   


    那估计是 Thinking in Java 比 Effective Java 的影响更为深远一些吧,呵呵
      

  21.   

    String s = "a" + "b" + "c" + "d";
    String str = "abcd";
    if(str == s)
    System.out.println(str);
    }
      

  22.   

    生成了两个对象, 一个是在String池 , s是一个地址,  一个是在内存里面,堆栈的形式s分别指向a,b,c,d,e     
      

  23.   

    这种优化是《java语言规范》规定的。所以,如果编译器不进行合并,不满足规范要求,就不是java编译器了。
      

  24.   

    不要看很多人都说是一个你就觉得是一个!
    原因:1. String类型一旦确定将不可更改。
          2. String s = "a"+"b";这行代码执行过程:首先去Pool中找是否存在a,若不存在则创建,然后找是否存在b,若不存在则创建,最后调用cancat方法去连接字符串,并去查找是否存在ab,若不存在则创建。
          3. 把ab的引用赋给s 。
    上面有人说的反编译其实看到的并不是你“想当然”的结果,而是编译器处理后的最终结果,当然只有一个了。
    而且,之所以StringBuffer的append方法比用“+”连接效率高就在于它是可变的,自始至终都是一个对象,而用“+”需要创建多个对象!
    期待有人提出异议!!!!!!!!
      

  25.   

    java语言规定,对这种常量字符串(字面常量)要进行合并。注意是规定,那些说跟编译器有关的就别理会了。
    比如String a = "a"+"b"+"c";编译器直接合并为a = "abc";
    编译完得到class文件,里面执行的语句功能就是a = "abc"了。
    java虚拟机只知道执行这么一句话,根本不知道"abc"到底是怎么来的。对于分不清编译和运行两个过程的,扯什么都白搭。
      

  26.   

    这个规定我是不大清楚,若真是这样,小弟没什么说的,但是如何解释StringBuffer比它效率高呢?
      

  27.   

    注意提到StringBuffer的背景。
    比如这样的例子
    String a = "a";
    String b = "b";
    String c = a + b;
    这时候a+b是两个变量连接,编译器无法进行直接的合并,它会考虑使用 StringBuilder连进行连接工作:
    编译器处理为:
    StringBuilder builder = new StringBuilder();
    builder.append(a);
    builder.append(b);
    然后String c=builder.toString();
    java5之前用StringBuffer替换。String类的+操作会产生新对象,造成性能问题。多个String连接就看到优化的好处了,如
    String a = "a";
    String b = "b"
    String c = "c";
    String d = "d";
    String e = "e";
    String f = a + b + c + d + e;
    最后一句将导致创建很多的String对象,"ab","abc","abcd","abcde"等。
    而使用StringBuilder只需要创建一次,不断append。最后再转到String。
      

  28.   


    其实"a"+"b"它的值在编译时就确定了,而且是可以确定的。所以,会在string pool里新建一个对象“ab”,没有“a”和“b”。
      

  29.   

    可以参考这个帖子,讲的很清楚
    http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html
      

  30.   

    当然是一个,实际上在编译后,池里只有"abcde",编译时编译器就将a,b,c,d,e连成一个字符串了