web-dev-qa-db-ja.com

falseとBoolean.FALSEの違いは何ですか?

C++では、windows.h FALSEは、いくつかの特殊なロジックの場合に意味のある整数として定義されますが、Java Java.lang.Boolean.FALSEは、ブール値として定義され、falseに割り当てられます
public static final Boolean FALSEそして私は何人かの人々がそれを使うのを見てきました。

私の質問:falseBoolean.FALSEの間にパフォーマンスの違いはありますか?一般的になぜ人々は行き、Boolean.FALSE

22

http://docs.Oracle.com/javase/7/docs/api/Java/lang/Boolean.html を参照してください。

_Boolean.TRUE_および_Boolean.FALSE_はbooleanではなく、Booleanです。これらは、Booleanbooleanおよびtrueに対応する2つのfalseラッパーオブジェクトの静的インスタンスです。

Booleanenumに似ています。 TRUEおよびFALSEインスタンスは Boolean.valueOf() によって返されるインスタンスです。

プリミティブとラッパーのパフォーマンスについては、あなたが心配する必要があるだろうという違いはありません。 TRUEおよびFALSE静的インスタンスはパフォーマンスに少し役立ちます。Javadocは、その理由から、Boolean.valueOf()ではなくnew Boolean(...)を使用することをお勧めします。 trueおよびfalseブール値は少し「低いレベル」ですが、それらをBooleanbooleanではなく)に保存している場合はとにかくそれは無関係です。

コードにとって最も意味のあるものを使用し、読みやすくする必要があります(そして、プリミティブ型とラッパー型のようなマイクロ最適化について考える道をたどらないでください)。 Booleanを使用している場合は、オブジェクトの値を使用します。 booleanを使用している場合は、プリミティブ値を使用します。 Booleanbooleanを決定する場合は、より適切なものを使用します(たとえば、Booleannullにすることができます。ジェネリック型パラメーターにはプリミティブ型を使用できません。一方、booleannullになりますnever同じように役立ちます)。

また、自動ボクシングはプリミティブ型をこれらの2つの静的Booleanインスタンスのいずれかに変換することにも注意してください。例:

_Boolean a = true;
assert(a == Boolean.TRUE);
_



余談ですが、あなたがそれを言及したので:FALSEは_windows.h_で2つの理由で定義されています:1)_windows.h_はCのみの日以来使用されており、Cはネイティブのboolタイプ、および2)既知の明示的なサイズと値を使用してデータタイプと値を定義することは、従来のMicrosoftの慣習です。 DLL境界を越えて(この質問の範囲を超えて)Windows API関数にデータを渡すため、および「true」と「false」の異なる表現を持つ他の言語と統合するため。それは完全に無関係ですJavaでの_Boolean.FALSE_の理由に。

34
Jason C

falseはプリミティブであり、Boolean.FALSEはオブジェクトなので、実際には比較できません。

次のように、falseBoolean変数に代入すると、

Boolean b = false;

Javaの自動ボクシングは、プリミティブをオブジェクトに変換するために発生するため、false値は失われ、最終的にBoolean.FALSEとにかく。

パフォーマンスの点では、プリミティブ変数を使用すると、ラッパーBooleanオブジェクトを使用してわずかにパフォーマンスが向上しますが、「パフォーマンス」ではなく、可読性と基本的な設計の決定に基づいて選択する必要があります。

7
Bohemian

Booleanは、トライステート変数が必要なときに便利です。

また、この オートボクシングとアンボクシングのチュートリアル 、および 動作のルール も確認してください。

5
GGrec

falseはプリミティブ型booleanの値であり、Boolean.FALSEは参照型Booleanの変数であるため、これは非常に奇妙な質問です。その値は、内部のブール状態がBooleanであるfalse型のオブジェクトへの参照です。

1
Andremoniy

パフォーマンスに関しては、Boolean.FALSEBooleanオブジェクトを返します。これにより、より柔軟に作業できるようになります。

プリミティブの代替は、より少ないメモリを使用します

1
Alex Vulaj

Booleanは、ブールのプリミティブ型のラッパークラスであり、intのIntegerと同じです。

ブール値には、プリミティブ型booleanを操作する多くのメソッドがあります

http://docs.Oracle.com/javase/6/docs/api/Java/lang/Boolean.html

0
pappu_kutty
Boolean a = null;
if (a) {
   // NullPointerException
}
if (a != false) {
   // NullPointerException
}
// Caution, comparing by reference, meaning 2 Booleans with same value could be different
if (a != Boolean.FALSE) {
    System.out.println("But this one works"); 
}
0
deathangel908

まず、これが不明確な場合は、Javaで数値を暗黙的にブール値にキャストすることはできません。たとえば、次のようにコンパイルすることはできません。

int a = 1;
if(a){
    //something, something
}

次に、パフォーマンスに関する考慮事項です。常にトレードオフがあります。

プリミティブ型booleanを使用する場合、trueまたはfalse(明らかにバイトエンコード)のvalueを直接使用しているため、パフォーマンスが向上するはずです。

オブジェクトタイプBooleanを使用すると、変数/フィールドに値が保持されますが、その値は実際にはオブジェクトへの参照であるため、すぐには使用できず、パフォーマンスが低下する可能性があります。もちろん、このペナルティはほとんどの場合重要ではありません。また、タイムクリティカルなアプリケーションを開発している場合は、おそらくJava :)を使用していません。それでも、オブジェクト型を使用すると、開発プロセスとユースケース実装の安全性にいくつかの利点がもたらされる可能性があります(たとえば、これによりnullが許可されます。これは、JPAエンティティをリレーショナルテーブルにマップし、nullを許可するビット型列がある場合に重要です。オブジェクトタイプの方が適している1つのシナリオ)。

最後に、ボックス化/ボックス化解除に注意してください。これにより、開発者は、boolean- typed変数が期待されるほとんどすべての場所(およびその逆)でBoolean- typed変数を使用できます。

0
Andrei Nicusan