ホームページ > Java > &#&チュートリアル > 「final」キーワードは Java の文字列比較にどのような影響を与えますか?

「final」キーワードは Java の文字列比較にどのような影響を与えますか?

Patricia Arquette
リリース: 2024-11-29 03:55:14
オリジナル
808 人が閲覧しました

How Does the `final` Keyword Affect String Comparisons in Java?

Java における文字列の比較と最終性

Java では、文字列が重要な役割を果たし、その動作は Final キーワードによって影響を受ける可能性があります。次のコード スニペットを考えてみましょう:

String str1 = "str";
String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string");
ログイン後にコピー

このコードは 2 つの文字列を連結し、等価演算子 == を使用してそれをリテラル文字列 string と比較します。結果は予想どおり false です。

ただし、文字列変数が Final として宣言されると、結果は変わります。

final String str1 = "str";
final String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string");
ログイン後にコピー

この場合、比較式は true を返すようになりました。この動作の変更により、final が文字列比較にどのような影響を与えるかという疑問が生じます。

ファイナリティとインターニングの相互作用

Java では、文字列がコンパイルで作成されるとき、時間定数式 (リテラル文字列など) を使用し、文字列変数が Final としてマークされると、定数変数になります。このような定数変数はコンパイラによってインライン化されます。つまり、その値が使用される場所に置き換えられます。

2 番目のコード例では、連結演算は事実上次のようになります。

String concat = "str" + "ing"; // Inlined from final variables
ログイン後にコピー

この結果は次のとおりです。 in:

String concat = "string";
ログイン後にコピー

文字列 string はインターンされます。つまり、一意の文字列インスタンスのプールに保存されます。同じインターンされたインスタンスは、同一の内容を持つ他の文字列リテラルに対しても使用されます。

concat と "string" を比較するとき、実際には、同じインターンされたインスタンスに対する 2 つの参照を比較していることになります。したがって、結果は true になります。

非最終ケース

最初のコード例では、文字列変数は最終ではないため、コンパイル時ではありません。定数式。連結操作は実行時に行われ、新しい String オブジェクトが作成されます。このオブジェクトはインターンされていないため、その参照は "string" のインターンされた参照とは異なり、誤った比較が行われます。

結論

Java では string を宣言します変数を最終変数として使用し、コンパイル時の定数式で初期化すると、文字列比較に影響を与える可能性があります。最終変数の場合と同様、文字列がインターンされると、一意のインターンされたインスタンスへの共有参照に基づいて比較が行われ、異なる結果が生じる可能性があります。

以上が「final」キーワードは Java の文字列比較にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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