これがあなたのJLS見積もり、セクション3.10.5です:
各文字列リテラルは、クラスString(§4.3.3)のインスタンス(§4.3.1、§12.5)への参照(§4.3)です。文字列オブジェクトには定数値があります。文字列リテラル(または、より一般的には、定数式(§15.28)の値である文字列)は、メソッドString.internを使用して、一意のインスタンスを共有するように「インターン」されます。
したがって、コンパイルユニット(§7.3)で構成されるテストプログラムは次のようになります。
package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }
およびコンパイルユニット:
package other;
public class Other { static String hello = "Hello"; }
出力を生成します:true true true true false true
この例は、6つのポイントを示しています。
同じパッケージ(§7)内の同じクラス(§8)内のリテラル文字列は、同じ文字列オブジェクト(§4.3.1)への参照を表します。
同じパッケージ内の異なるクラス内のリテラル文字列は、同じStringオブジェクトへの参照を表します。
異なるパッケージの異なるクラス内のリテラル文字列は、同様に同じStringオブジェクトへの参照を表します。
定数式(§15.28)によって計算された文字列は、コンパイル時に計算され、リテラルであるかのように扱われます。
実行時に連結によって計算された文字列は新しく作成されるため、区別されます。計算された文字列を明示的にインターンした結果は、同じ内容の既存のリテラル文字列と同じ文字列になります。
インターン用のJavaDocと組み合わせると、両方のケースがtrueを返すと推測するのに十分な情報が得られます。