ホームページ > Java > &#&チュートリアル > Java での最終文字列の `==` 比較で True が返される場合と False が返される場合があるのはなぜですか?

Java での最終文字列の `==` 比較で True が返される場合と False が返される場合があるのはなぜですか?

Susan Sarandon
リリース: 2024-11-30 16:42:14
オリジナル
253 人が閲覧しました

Why Does `==` Comparison of Final Strings in Java Sometimes Return True and Sometimes False?

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 つのバージョンの違いは、バイトコードで確認できます。

  • なし-最終バージョン: StringBuilder を作成し、実行時に文字列を連結して、新しい String を作成します。 object.
  • 最終バージョン: 参照されたインターン インスタンスを直接使用して、コンパイル時に連結された文字列 "string" をインライン化します。

結論

Java のコンパイル時の定数式を含む最終文字列はインターンされ、一意のインスタンスを共有します。 「==」を使用して比較すると、値ではなくオブジェクト参照が直接チェックされるため、予期しない結果が生じる可能性があります。

以上がJava での最終文字列の `==` 比較で True が返される場合と False が返される場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート