いいえ、特定の文字列は文字列リテラルプールから再利用されます。たとえば、次の場合:
final String foo = new String("string literal");
そうすれば、実際、メソッドが呼び出されるたびに新しいものが作成されます。
ここに証拠があります:
public static void main(String[] args) throws Exception {
String s1 = test1();
String s2 = test1();
System.out.println(s1 == s2); // true
String s3 = test2();
String s4 = test2();
System.out.println(s3 == s4); // false
}
private static String test1() {
final String foo = "string literal";
return foo;
}
private static String test2() {
final String foo = new String("string literal");
return foo;
}
final
この特定のケースでは、修飾子は影響を与えないことに注意してください。変数の再割り当てを禁止するだけです。