>>122は「通常」とかいってる時点で分かってないと思われ。
言語仕様に通常も何もないわけだが。

リテラルがらみの言語仕様をまとめると以下のような感じだな。
String s = "hoge";と定義されているとき、

1.リテラル文字列
 →同じオブジェクトへの参照を表現する。

  s == "hoge" → true

2.定数式によって計算される文字列
 →コンパイル時に計算され,リテラルであるかのように扱われる。

  s == ("ho" + "ge") → true

3.実行時に計算される文字列
 →新しく生成されるものであって,別の文字列とする。

  String ge = "ge";
  s == ("ho" + ge) → false

4.計算された文字列を明示的に収容(intern)した結果
 →同じ内容をもつ既存のリテラル文字列と同じ文字列とする。

  String ge = "ge";
  s == ("ho" + ge).intern() → true