public String makingStrings(){
  String s="Fred";
  s=s+"47";
  s=s.substring(2,5);
  s=s.toUpperCase();
  return s.toString();
}
How many String objects will be created when this method is invoked?

解决方案 »

  1.   

    1. String s = "Fred"; 这一句将从jvm的字符串缓存池中取出一个字符串,如果不存在就创建之。我们可以认为是创建了第一个对象。
    2. s = s + 47; 对于这一句,java编译器在编译的时候,会作优化,也就是编译的时候就直接将 字符串 s 和 47 组合成为字符串 "Fred47",对运行时而言,等同于 s = "Fred47";仿照 1 的解释,那么这一句在运行时也可以被认为是创建了一个对象,第二个对象。有
    3. s = s.subString(2, 5); 这一句显然会产生一个对象,从String的源代码我们可以清楚的知道这一点:
        return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
        }
    4. s = s.toUpperCase(); 这一句单从toUpperCase()方法的角度思考,可能会产生一个对象,也可能会返回本身。这一点取决于原始字符串是否全部是大写的。如果不是,就会产生一个新的对象。显然,"Fred47" 会产生一个新的对象。 从String的源代码可以知道这一点。我们就有了第三个对象
    5 return s.toString(); 这一句不会产生新的对象,它简单的返回自身。综上所述,我们得到了3个对象。
      

  2.   

    对于第二点,我需要补充。加入说第二个语句,不是 s = s + 47;而是 s = "Fr" + "ed"; 那么,我的答案将是这一句不产生对象。应为编译器在编译这一句的时候,会直接将它优化为 s = "Fred";其效果等同于第一个语句。那么,它将不产生对象。
      

  3.   

    对于第四点补充一下,如果 s 的值恰好是 s = "FRED" 的话,那么第四个语句(s = s.toUpperCase();)就将简单返回自身,不产生对象。
      

  4.   

    我作了一个试验,很不好意思,第二点的解释不完全正确。编译器的优化,仅仅在 字符串常量 的时候有效。举个例子:
    String s1 = "Fr";
    String s2 = "ed";
    String s3 = s1 + s2;
    对这种语句,编译时无法优化为 String s3 = "Fred",因为s1和s2都是变量。但是对 String s3 = "Fr" + "ed";
    对这种语句,是可以在编译时优化成 String s3 = "Fred";的。对于这个例子,又可以优化了:
    fianl String s1 = "Fr";
    final String s2 = "ed";
    String s3 = s1 + s2;
    对这种句子,编译时也会将之优化为 String s3 = "Fred";
      

  5.   

    string值的改变,只是提升版本号,改了5次,返回5个!
      

  6.   

    第四点错了,应该是ed4很显然,怎么成fred了
      

  7.   

      关于s=s.toUpperCase(); 
    应该是不取决于原始字符串吧,不管原始字符串时什么,它都将产生一个新的String!
    请参看java.lang.String源码中的定义!
      

  8.   


    String str="ABC";
    String str2=str.toUpperCase();
    System.out.println(str==str2);
    测试结果true
    说明在toUpperCase()的时候,如果本身已经是大写了,则直接返回自身