Javaのブール型とブール型


195

IntegerintJava に関する議論があります。前者のデフォルト値はnull、後者では0です。どの程度Booleanboolean

アプリケーションの変数に0/ 1値を含めることができます。boolean/ を使いたいのですが、使いBooleanたくないintです。代わりにBoolean/ を使用できますbooleanか?


2
システム設計上の理由から、「ユーザーがまだ決定していない」オプションが「true」でも「false」でもないため、ブールを選択します。私は真/偽のオプションで十分であると100%確信している場合にのみブールプリミティブを使用します。データベースでは、通常NULLオプションが問題なく使用できます(または、後でNULL制限を削除するだけで)
CsBalazsHungary

2
Javaのブール値とブール値の違い何ですか?(GWTは違いをもたらさないため)。
Dan Dascalescu、2016年

回答:


270

はい、代わりにBoolean/ を使用できますboolean

1つ目はオブジェクトで、2つ目はプリミティブ型です。

  • 最初に、あなたは便利になるより多くのメソッドを取得します。

  • 2つ目はメモリ費用を考慮して安価です2つ 目はより多くのメモリを節約できるので、それを試してください

今あなたの方法を選択してください。


70
あなたはこれを「2番目はあなたに多くのメモリを節約するのでそれのために行く」と言ったかもしれません。ブール値の便利なメソッドは、ほとんどの場合、そのインスタンスがなくても呼び出すことができます。
DJクレイワース

3
new Boolean(value)の代わりにBoolean.valueOf(value)を使用する限り、メモリは問題になりません。
グレッグケース

2
の場合AsyncTask、のBoolean代わりにのみ使用できますboolean
ラプター

98
なお、ブールは、実際には3つの状態を...持っているtruefalsenullブール論理2つの状態を持つ(truefalse
respectTheCode

14
ブール値はトリリアンです:)
Topera

50

Boolean ブールプリミティブ型をラップします。JDK 5以降では、Oracle(またはOracleが購入する前のSun)がautoboxing / unboxingを導入しました。これにより、基本的にこれを行うことができます

boolean result = Boolean.TRUE;

または

Boolean result = true; 

これは本質的にコンパイラーが行いますが、

Boolean result = Boolean.valueOf(true);

だから、あなたの答えはYESです。


4
注:をに安全に割り当てられるBooleanとは限りませんboolean。あなたの場合Booleanですnullと、あなたがそれを割り当てようとboolean、それがスローされますNullPointerException実行時。
Duncan Luk

Booleanクラスの場合、同じブール変数を参照している別のクラスから値を変更しても、値が常にfalseになるのはなぜですか?Boolean異なるインスタンスクラスから参照できない場合/引数として渡すことができない場合、これの意味は何ですか?
user924

答えが見つかっAtomicBooleanたら、差分クラスから使用して参照できます
user924

35

これまでのところ、彼らは、特定の言語のプログラミングの代わりのシーンの背後にある大きな絵の世話をしに焦点を当て、彼らの「自分」/人工用語に集中するので、私は(ビットが提供する答えを拡張していますプログラミング言語を作成し、一般的に、すなわちときの事、型安全性とメモリの考慮が違いを生むように):

intはブール値ではありません

検討する

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

出力あり

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

3行目のJavaコード(bar)?1:0は、barブール)を暗黙的にintに変換(キャスト)できないことを示しています。JVMの背後にある実装の詳細を説明するためではなく、低レベルの考慮事項(メモリサイズとして)の観点から、型の安全性よりも値を優先する必要があることを指摘します。特にその型安全が真に/完全に使用されていない場合は、チェックが次の形式で行われるブール型のように

値が\ in {0,1}の場合はブール型にキャストし、それ以外の場合は例外をスローします。

{0,1} <{-2 ^ 31、..、2 ^ 31 -1}と述べているだけです。やりすぎのようですよね?タイプセーフは、プリミティブの暗黙的なキャストではなく、ユーザー定義型で本当に重要です(ただし、最後は最初に含まれます)。

バイトはタイプでもビットでもありません

メモリ内では、{0,1}の範囲の変数は、特別に配慮されていない限り、少なくとも1バイトまたは1ワード(レジスタのサイズに応じてxビット)を占有します(たとえば、メモリに適切にパックされている-8 "ブール値" 1バイトへのビット-前後)。

(たとえば、ビットシフトまたは演算を使用して)追加の値パッキングよりもタイプセーフ(特定のタイプのボックスへの値の配置/ラップなど)を優先することで、より多くのメモリを獲得するよりも少ないコードを書き込むことを効果的に選択します。(一方で、ブール値に値しないすべての変換を容易にするカスタムユーザータイプを常に定義できます)。

キーワードとタイプ

最後に、質問はキーワードタイプの比較についてです。私はあなたが(として「マーク」のキーワードを好む/使用してパフォーマンスを取得する方法を正確に理由を説明したりすることが重要であると考えているプリミティブ型(別のキーワード使用して、通常の複合ユーザー定義可能なクラスを介して)クラスを)、または他の言葉で

boolean foo = true;

Boolean foo = true;

最初の「もの」(タイプ)は、理由なしでは拡張(サブクラス化)できません。事実上、プリミティブクラスと ラッピングクラスのJava用語は、インライン値(置換を推論できる場合は常にコンパイラーによって直接置換されるLITERALまたは定数-まだ値をラップするためのフォールバック)に単純に変換できます。

最適化は簡単なために達成されます:

「実行時のキャスト操作が少ない=>速度が向上しました。」

そのため、実際の型推論が行われると、必要に応じて、ラッピングクラスがすべての型情報でインスタンス化(または変換/キャスト)されることになります。

したがって、ブール値ブールの違いは、コンパイルランタイムにあります(少し遠いですが、ほとんどinstanceofgetClass()が同じです)。

最後に、オートボクシングはプリミティブよりも遅い

Javaがオートボクシングを実行できるという事実は、単なる「構文上の砂糖」であることに注意してください。それは何もスピードアップせず、より少ないコードを書くことを可能にします。それでおしまい。タイプ情報コンテナへのキャストとラップは引き続き実行されます。パフォーマンス上の理由から、型の安全性を実装するために、型情報を持つクラスインスタンスを作成する余分なハウスキーピングを常にスキップする算術を選択してください。型安全性の欠如は、パフォーマンスを得るために支払う代償です。ブール値の式を使用するコードの場合、型の安全性(より少ない、つまり暗黙的なコードを記述する場合)は、if-then-elseフロー制御などでは重要です。


16

あなたは使用することができ、ブール定数を - Boolean.TRUEBoolean.FALSEの代わりに、01booleanプリミティブが目的のものである場合は、型として変数を作成できます。これにより、新しいBooleanオブジェクトを作成する必要がなくなります。


3

基本的にブール値はプリミティブデータ型を表し、ブール値は参照データ型を表します。この話は、Javaが純粋にオブジェクト指向になりたいときに、プリミティブデータ型を使用できるようにするラッパークラスの概念が提供されたときに始まります。

boolean b1;
Boolean b2;

b1b2同じではありません。


3

1つの観察:(これは副作用と考えることができますが)

booleanがプリミティブであることは、yesまたはnoのどちらかです。

ブール値はオブジェクトです(はい、いいえ、または「わからない」、つまりnullを参照できます)。


1

ブール/ブールを使用できます。シンプルさが進むべき道です。特定のAPI(コレクション、ストリームなど)を必要とせず、それらが必要になると予測していない場合は、そのプリミティブバージョン(ブール値)を使用します。

  1. プリミティブを使用すると、null値を渡さないことが保証されます。
    このような罠に陥ることはありません。以下のコードはNullPointerExceptionをスローします(from:ブール値、条件演算子、オートボクシング):

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. オブジェクトが必要な場合はブール値を使用します。例:

    • ブール値のストリーム、
    • オプション
    • ブール値のコレクション
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.