文字列がJavaでインターンされているかどうかを確認する方法についてこの回答を読みましたが、次の結果がわかりません。
String x = args[0]; // args[0] = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // true
しかし、文字列リテラルを宣言すると、次のようになります。
String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false
その上、文字列リテラルがなければ、はargs[0]
直接インターンされているようです。
// String x = "abc";
String y = args[0];
System.out.println(y.intern() == y); // true (???)
// false if the first line is uncommented
コマンドライン引数を使用した場合でも、リテラルy.intern() == y
かどうかによって変化するのはなぜですか?x
リテラル文字列がコンパイル時にインターンされることは知っていますが、前の例で影響する理由がわかりません。文字列プールの動作、Javaの文字列プールとJava文字列プールに関する質問など、文字列のインターンに関するいくつかの質問も読みました-プールはいつ変更されますか?。しかし、それらのどれもこの振る舞いに可能な説明を与えていません。
編集:
String x = "abc";
3番目の例では、が宣言されていても結果は変わらないと間違って書きましたが、変わります。