Java の == と Final 文字列の比較
Java の文字列は不変であり、final として宣言されると独自の動作をします。次のコードを考えてみましょう。
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string"); // false
ここでは、「==」がオブジェクト参照を比較するため、比較は false を返します。ただし、文字列をfinal:
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string"); // true
と宣言すると、比較は不可解にもtrueを返します。
Reason
初期化される最終文字列上記の例のようなコンパイル時の定数式では、定数変数になり、一意のプロパティを取得します。つまり、インターンされます。インターンとは、文字列の一意のインスタンスが共有されることを意味します。
2 番目のコード スニペットでは、連結結果「string」がコンパイル時にインターンされます。したがって、「==」に渡される文字列リテラル「string」と同じ参照を共有します。これにより、真の比較が行われます。
バイトコード分析
2 つのバージョンの違いは、バイトコードで確認できます。
結論
Java のコンパイル時の定数式を含む最終文字列はインターンされ、一意のインスタンスを共有します。 「==」を使用して比較すると、値ではなくオブジェクト参照が直接チェックされるため、予期しない結果が生じる可能性があります。
以上がJava での最終文字列の `==` 比較で True が返される場合と False が返される場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。