1. ホーム
  2. java

ストリングプールの奇妙な動作

2023-09-29 22:10:20

質問

String poolの奇妙な挙動について質問です。 私は == を使って、同じ文字列を比較し、プールにあるかどうかを調べています。

public class StringPoolTest {
  public static void main(String[] args) {
    new StringPoolTest().run();
  }

  String giveLiteralString() {
    return "555";
  }

  void run() {
    String s1 = giveLiteralString() + "";
    System.out.println("555" == "555" + "");
    System.out.println(giveLiteralString() == giveLiteralString() + "");
  }
}

と出力されます。

true
false

というのは、私にとって大きな驚きです。どなたかこれを説明していただけませんか? 私は、このことに関する何かがコンパイル時に行われていると思います。しかし、なぜ "" を追加すると、全く違いがないのですか?

どのように解決するのですか?

"555" + ""

コンパイル時定数 であり、一方

giveLiteralString() + ""

はそうではありません。したがって、前者は単なる文字列定数 "555" にコンパイルされ、後者は実際のメソッド呼び出しと連結にコンパイルされ、結果として新しい String インスタンスになるのです。


また JLS §3.10.5 (文字列リテラル) :

実行時に連結して計算される文字列は、新しく作成されるため であるため、区別されます。