web-dev-qa-db-ja.com

==ブール値の完全な同等性を確認しますか? -Java

だから、2つの文字列を==と比較すると、両方が同じオブジェクト/インスタンスを参照している場合にのみ真になると聞いたことがあります。それは文字列です。ブール値はどうですか?

25
Bluefire

==ブール値の完全な同等性をチェックしますか? -Java

Booleans(オブジェクトラッパー、大文字のB)かbooleans(プリミティブ、小文字のb)のどちらであるかによって異なります。すべてのオブジェクトと同様に、Booleans(オブジェクトラッパー)について話している場合、==identityではなく、equivalenceをチェックします。 booleans(プリミティブ)について話している場合、等価性をチェックします。

そう:

Boolean a, b;
a = new Boolean(false);
b = new Boolean(false);
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance

だが

boolean c, d;
c = false;
d = false;
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value

文字列について:

2つの文字列を==と比較すると、文字列が同一であり、両方が同じオブジェクト/インスタンスを参照している場合にのみ真になると聞いたことがあります...

それは実際には「and」ではありません:==only2つのString変数が同じStringインスタンス。もちろん、1つのStringインスタンスは1つのコンテンツセットしか持つことができないため、両方の変数が同じインスタンスを指す場合、当然コンテンツは同じになります... :-)重要な点は==differentfalseインスタンスのStringは、同じ文字が同じ順序である場合でも報告します。そのため、==ではなく、equalsを使用します。 interning が原因で文字列が少し混乱する可能性があります。これは文字列に固有です(Booleanに相当するものはありませんが、Boolean.valueOf(boolean)を使用すると、キャッシュされたオブジェクトを取得します)。また、Javaはプリミティブbooleanintなどのようにプリミティブストリングを持たないことに注意してください。

43
T.J. Crowder

Object use equalsがある場合、そうでない場合はこのようなことを実行できます。 (オートボクシングプリミティブのVMキャッシュ)

    public static void main(String[] args){
       Boolean a = true;
       Boolean b = true;
       System.out.println(a == b);
       a = new Boolean(true);
       b = new Boolean(true);
       System.out.println(a == b);
   }

出力はTRUEおよびFALSEです

3
kaytastrophe

intbooleanlongのような値型について話しているのか、IntegerBooleanLong。値型は==と比較できますが、参照型はequalsと比較する必要があります。

1
0lukasz0

ブール値で(==)を使用する場合、

  1. オペランドの1つがブールラッパーである場合、まずブールプリミティブにボックス化解除され、2つが比較されます。

  2. 両方が「新規」キーワードで作成されたブールラッパーである場合、他のオブジェクトの場合と同様に、それらの参照が比較されます。 new Boolean("true") == new Boolean("true")はfalse

  3. 両方が「新しい」キーワードなしで作成されたブールラッパーである場合、

    Boolean a = false;
    Boolean b = Boolean.FALSE;
    // (a==b) return true
    
0