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?
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?
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个对象。
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";
应该是不取决于原始字符串吧,不管原始字符串时什么,它都将产生一个新的String!
请参看java.lang.String源码中的定义!
String str="ABC";
String str2=str.toUpperCase();
System.out.println(str==str2);
测试结果true
说明在toUpperCase()的时候,如果本身已经是大写了,则直接返回自身