ホームページ >Java >&#&チュートリアル >Java で文字列を「final」として宣言すると、「==」による文字列の比較方法が変わりますか?
Java で Final 宣言された場合の == との文字列の比較
Java では、== 演算子は 2 つのオブジェクトのメモリ参照を比較します。ただし、文字列が Final として宣言され、コンパイル時の定数で初期化されると、独特の動作が発生します。
シナリオ 1: Final 以外の文字列
次のコードを考えてみましょう。セグメント:
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
このコードの結果は false になります。連結操作により、既存の文字列リテラル "string" と等しくない新しい String オブジェクトが作成されます。
シナリオ 2: 最終文字列
次に、文字列をfinalとして宣言します:
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
驚くべきことに、結果は次のようになります。は今では真実です。これは、文字列を Final として宣言すると、コンパイラがその値をインライン化し、式全体をコンパイル時の定数式として扱うことができるためです。
コンパイラの最適化: Interning
コンパイル時の定数式に文字列が含まれる場合、Java 仮想マシン (JVM) はそれを「インターン」します。これは、文字列の一意のインスタンスを次の場所に保存することを意味します。文字列プールと呼ばれる特別な場所。したがって、2 番目のシナリオの連結された文字列は、インターンされた文字列 "string" と直接比較され、結果は true になります。
結論
次のように文字列を Final として宣言します。コンパイル時定数により、オプティマイザは式を単一の String オブジェクトとして扱い、既存の文字列との構文上の等価性チェック (==) が可能になります。リテラル。これは、Java でのコンパイラの最適化と、それがオブジェクト ID の比較にどのような影響を与えるかを示しています。
以上がJava で文字列を「final」として宣言すると、「==」による文字列の比較方法が変わりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。