Given:
11. public String makinStrings() {
12. String s = “Fred47”;
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }How many String objects will be created when this method is invoked?我觉得是5个,对不?^_^

解决方案 »

  1.   

    知道在JAVA中String具有不可变性就好了。
    所以,一旦重新赋值,那就一定不是原来的了!
      

  2.   

    13. s = s + “47”;“47”是一个,s+"47"又是一个吧,所以一共应该有5个吧?是不?^_^
      

  3.   

    恩 我觉得是只创建了一个对象 string s 这个对象
      

  4.   

    题目问的是当此方法被调用的时候,将会有几个String对象被创建。所以两个字符串常量是不能算的,它们在早在方法调用之前就已经存在了。因此只有3个String对象将被创建。
      

  5.   

    只是创建一个String对象!并S指向这个对象
      

  6.   

    只创建了一个对象,String类型是不会变的,你进行了一系列的操作,但对象始终是开始创建的那个
      

  7.   

    我觉得也是五个,我觉得这五个对象分别应该是s,“Fred47”,s+"47",s.substring(2, 5),s.toUpperCase()
       不知道大家是否也这样认为.
      

  8.   

    是四个,首先11. public String makinStrings() {
    12. String s = “Fred47”;  定义了一个对象“Fred47”,s是指向这个对象的一个引用
    13. s = s + “47”;         先进行s + “47”,因为不可变性,又定义了一个对象s + “47”,把S指向了这个新增加的对象
    14. s = s.substring(2, 5);  截取字符串一个新的对象
    15. s = s.toUpperCase();    又是一个新的对象
    16. return s.toString();
    17. } 
      

  9.   

    jdk中有没有方法统计 创建的对象???
    干说无凭~
      

  10.   

    不好意思说错了,应该是两个,最后一句在String对象上调用toString()方法应该返回该对象本身。
      

  11.   

    创建了一个对象,重新赋值后String对象的值就等于新的值了!
      

  12.   

    1:Fred47 data区
    2: 47 data区
    3:Fred4747 堆
    4:ed4 堆
    5:ED4 堆
    共五个对象不知道这样对不对?
      

  13.   

    看看这个吧 
    讲的非常清楚了 
    http://hi.baidu.com/xun1573/blog/item/42617ad8acb7333333fa1c9f.html
      

  14.   

    正解:3个
    记住一个原则:String每次修改都会产生新的String,但是substring不产生新的String。11. public String makinStrings() { 
    12. String s = “Fred47”; //产生了一个
    13. s = s + “47”;        //又产生了两个
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase(); 
    16. return s.toString(); 
    17. } 
      

  15.   

    把楼上的修改一下:
    正解:3个 
    记住一个原则:String每次修改都会产生新的String,但是substring不产生新的String。 
    11. public String makinStrings() { 
    12. String s = “Fred47”; //产生了一个 
    13. s = s + “47”;        //又产生了一个 
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase(); //又产生了一个 
    16. return s.toString(); 
    17. } 
      

  16.   

    这是哪来的原则?
    看substring的源代码最后是:return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);如果要的子串正好是原串的话的确是不产生新串了。不过这种情况太不常见了,大部分情况下还是要new
      

  17.   


    ye shi zhe yang xiang de 
      

  18.   

    5个。
    Fred47 
    47
    Fred4747
    ed4
    ED4
    只有toString()里面直接return this;不创建新对象。
      

  19.   

    准确地说,是三到五个.
    说五个的人基本是理解了,但那两个字面值不一定是方法调用中产生的,如果执行ldc时在CONSTANT_String_info中已经存在那两个字面值,则ldc直接引用它们.
    如果没有,则在方法调用的过程中创建并将这两个字面值拘留在池中,而其它三个String对象是肯定要在方法中产生的.所以准确地说是创建三到五个.
      

  20.   

    顺便说一句,很多时候出问题的人自己并不真正了解问题的本质.就象传给匿名类的参数就是为什么要是final的,到目前为止没有看到一个人真正知道,网上所有答应几年来没有一个是正确的.
      

  21.   


    按照精华贴说的,应该是5个,我也觉得是5个额只是答案说是3个,是SCJP模拟题。
    所以想请教一下。呵呵,也许是模拟题觉得两个池中的对象“可能”已存在,所以不算创建的?- -
      

  22.   

    我已经说了,就题目而言,答案既然不是三个,也不是五个,是三或四或五.
    因为出题的人自己并不真正懂,所以题目出现了偏差.比如在外部写一个main方法,直接调用makeString,这答案就是五个,因为main方法是JVM刚启动,之前CONSTAN_string_info入口还没有解析,所以五个字符串都是在这次方法调用中产生的.或者问在堆中产生几个对象,那就是确定的答案三个.
    而本题的问题不可能知道在方法执行前字符串常量池是否有了那个常量.所以不可能知道是否要在方法调用时产生它们,所以三到五个才是正确的答案,这说明出题的人自己不明了了.另外什么精华贴之类的,很多都是在搞笑.
      

  23.   

    scjp的模拟题答案有问题的很多。
    我今天也看了个scjp材料上的类似的问题,那上面举了个类似的例子,分析方法也类似。5个应该没问题。
      

  24.   

    分数本来只有屁用.
    但这么多个人把自己认真思考的观点发表出来,只有0分.
    "scjp的模拟题答案有问题的很多。 
    我今天也看了个scjp材料上的类似的问题,那上面举了个类似的例子,分析方法也类似。5个应该没问题。"
    这样的答案竟然是20分.楼主要想移分真正说明,骗那么多人进来讨论干什么呢?
      

  25.   

    axman老大来CSCN混了啊,久仰已久,这贴又跟你学到了一些东西,哈哈