ホームページ > Java > &#&チュートリアル > Java 整数の比較: `==` が時々失敗するのはなぜですか? いつ `.equals()` を使用する必要がありますか?

Java 整数の比較: `==` が時々失敗するのはなぜですか? いつ `.equals()` を使用する必要がありますか?

Barbara Streisand
リリース: 2024-12-30 06:29:08
オリジナル
367 人が閲覧しました

Java Integer Comparison: Why Does `==` Sometimes Fail, and When Should I Use `.equals()`?

Java: 整数等価性の難問 - 等しい vs. ==

整数とそれに対応するラッパー クラスである Integer は、多くの場合同じ意味で使用できます。等価演算子を使用して 2 つの整数値を比較すると、特有の動作が発生しました。 (==).

予期しない結果

次のコード スニペットを考えてみましょう:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;
ログイン後にコピー

驚くべきことに、この条件は不一致を誤って設定しているようです。 cdiCt と cdsCt の基礎となる値が等しい場合でも true (たとえば、両方に値 137).

オートボクシングの問題

この不可解な動作の原因は、Java のオートボクシング メカニズムにあります。プリミティブ (int など) と対応するラッパー クラス (Integer など) を比較する場合、オートボクシングはプリミティブをそのラッパー オブジェクトに自動的に変換します。ただし、この変換には微妙な複雑さが伴います。

JVM キャッシュ

パフォーマンス上の理由から、JVM は -128 から 127 までの整数値をキャッシュします。この範囲では、JVM は新しいインスタンスを作成するのではなく、キャッシュされたインスタンスを単に返します。このキャッシュ メカニズムにより、同じプリミティブ値 (キャッシュされた範囲内) へのすべての参照が同じ Integer インスタンスを指すことが保証されます。

== 比較失敗

2 つを比較する場合等価演算子 (==) を使用して整数オブジェクトを指定すると、Java はそれらがメモリ内の同じオブジェクトを参照しているかどうかをチェックします。一致する場合、比較は true を返します。それ以外の場合は false を返します。ただし、両方ともキャッシュされた範囲内にあり、同じプリミティブ値を保持する 2 つの Integer オブジェクトを比較すると、同じキャッシュされたインスタンスが参照されるため、== 比較で誤検知が発生します。

解決策:equals メソッドを使用します

この問題を回避するには、Integer オブジェクトを比較するときに、equals メソッドを使用することをお勧めします。 equals メソッドは値ベースの比較を実行し、2 つの Integer オブジェクトが同じプリミティブ値を持つ場合にのみ等しいとみなされます。

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
    mismatch = true;
ログイン後にコピー

結論

== を使用してキャッシュされた範囲 (-128 ~ 127) 内の Integer オブジェクトを比較すると、機能しているように見えても、予期しない結果が生じる可能性があります。信頼性の高い等価比較を保証するには、代わりに常にequalsメソッドを使用してください。

以上がJava 整数の比較: `==` が時々失敗するのはなぜですか? いつ `.equals()` を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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