タイトルの質問に答えるには: コンパイル時にString
インターンするプールがないため、技術的にはランタイムのみです。
ただし、ソース ファイルで定義されているすべての文字列リテラルと定数値の文字列は、プログラムの起動時に自動的にインターンされ、String#intern()
メソッドを使用して追加の文字列をインターンできます。
また、将来の読者のために:OPの結果は、何よりもIDEの癖のようです。OP は元々、BlueJ のカスタムpublic static void main(String string_input)
main メソッド シグネチャを介してコマンド ライン引数として入力を入力していました。どうやらBlueJは、これをpublic static void main(String[] args)
JLSが必要とする署名と一致させるために舞台裏でいくつかの悪ふざけを行っており、明らかにこれらの悪ふざけは、ある時点で入力文字列をインターンすることを含み、OPの結果につながります。
以下の回答の編集: ちょっとした読み間違いをしたようです。この答えは何とか(一種の)機能しますが、OPが質問を更新するまで確認できないという事実に依存していstring == string_input
ます(ソースコードが削除されているため、明らかに実行できません)。
答えは のソース コードにありますString
。
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
最後の行に注目してください: ifの場合beginIndex == 0
、オリジナルString
自体が返されます。したがって、ケース 1 では、string
実際に と同じオブジェクトを指しているstring_5
ため、true
が出力されます。
ただし、 の場合beginIndex != 0
、新しいString
が作成されるため、string
は と同じオブジェクトを指していないstring_5
ため、false
が出力されます。