String makeStrings() {
String s = "HI"; //String literal
s = s + "5"; //concatenation creates new String object (1)
s = s.substring(0,1); //creates new String object (2)
s = s.toLowerCase(); //creates new String object (3)
return s.toString(); //returns already defined String
}
对于连接,当创建一个新的String时,JVM使用StringBuilder,即:
s = new StringBuilder(s).append("5").toString();
StringBuilder的toString()是:
public String toString() {
return new String(value, 0, count); //so a new String is created
}
substring创建一个新的String对象,除非整个String被索引:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex)
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
toString()不创建一个新的字符串:
public String toString()
{
return this;
}
toLowerCase()是一个很长的方法,但足以说,如果字符串不是已经全部小写,它将返回一个新的字符串。
鉴于提供的答案是3,正如Jon Skeet所建议的,我们可以假设两个String文字已经在String池中。有关将字符串添加到池中的时间的详细信息,请参阅Questions about Java’s String pool。