タイトルの質問に答えるには: コンパイル時に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が出力されます。