ホームページ >Java >&#&チュートリアル >Java で文字列を「final」として宣言すると、「==」比較に影響しますか?

Java で文字列を「final」として宣言すると、「==」比較に影響しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 06:12:10594ブラウズ

Does Declaring Strings as `final` in Java Affect `==` Comparisons?

Java で Final として宣言された == を使用した文字列の比較

Java で等価演算子 (==) を使用して文字列を比較すると、結果は文字列がfinalとして宣言されているかどうかによって異なる場合があります。

Final Strings

文字列が Final として宣言されると、コンパイラは値をコンパイル時の定数式としてインライン化することで文字列を最適化します。これは、文字列値が実行時に動的に割り当てられるのではなく、コンパイル時に決定され、バイトコードに直接格納されることを意味します。

最終文字列の動作

Final として宣言された文字列の場合、比較式 concat == "string" は true を返します。なぜなら:

  • コンパイラは、連結操作をインライン化された文字列に置き換えます。 String concat = "str" "ing"; // String になります concat = "string";
  • 文字列リテラルはインターンされます。これは、同じ文字列値への複数の参照が同じインスタンスを共有することを意味します。したがって、concat とリテラルの "string" は同じ String オブジェクトを参照し、真の等価性が生じます。

Non-Final Strings

対照的に、 -final 文字列はインライン化されず、実行時に動的に割り当てられます。連結操作では、メモリ内のリテラルの「文字列」とは異なる新しい String オブジェクトが作成されます。その結果、比較式 concat == "string" は false を返します。

検証

この動作を確認するには、非最終バイトコードと最終バイトコードを比較できます。文字列バージョン:

非最終版バージョン:

// stores str and ing in separate variables and uses StringBuilder for concatenation

最終バージョン:

// directly inlines the final variable to create String string at compile time

したがって、文字列を Final として宣言し、コンパイル時の定数式で初期化すると、文字列リテラルのインライン化とインターン化による == を使用した等価比較の結果。

以上がJava で文字列を「final」として宣言すると、「==」比較に影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。