web-dev-qa-db-ja.com

Javaにおけるブール値とブール値

JavaではIntegerintの間で議論があります。前者のデフォルト値はnullで、後者のデフォルト値は0です。 Booleanbooleanはどうですか。

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

161
Neel

Yes代わりにBoolean/booleanを使用できます。

1つ目はObject、2つ目はプリミティブ型です。

  • 最初の1つでは、もっと便利なメソッドが手に入ります。

  • 2つ目は、メモリ使用量を考えると安いです 2番目のものはあなたにより多くのメモリを節約するでしょう、それでそれのために行きます

今あなたの方法を選びなさい。

229
Jigar Joshi

Booleanはブールプリミティブ型をラップします。 JDK 5以降では、Oracle(またはOracleが購入する前のSun)が 自動ボックス化/ボックス化解除 を導入しました。これにより、基本的にこれを実行できます。

boolean result = Boolean.TRUE;

または

Boolean result = true; 

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

Boolean result = Boolean.valueOf(true);

だから、あなたの答えのために、それはYESです。

48
Buhake Sindi

提供された答えを少し拡張しています(これまでのところ、プログラミング言語を作成する舞台裏の大きな画像の世話をするのではなく、特定の言語のプログラミングに焦点を当てた「独自の」/人工的な用語に集中しているため、一般的に、つまり型安全性とメモリの考慮事項のようなものが違いを生む場合):

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は、barboolean)を暗黙的に変換(キャスト)できないことを示しています)へint JVMの背後にある実装の詳細を説明するためではありませんが、低レベルの考慮事項(メモリサイズとして)の観点から、タイプセーフよりも値を優先する必要があることを指摘します。特に、チェックが次の形式で行われるブール型のように、そのタイプセーフティが本当に/完全に使用されていない場合

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

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

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

メモリでは、{0,1}の範囲の変数は、特に注意を払わない限り(たとえば、メモリにうまく詰められている-8 "ブール値")、少なくとも1バイトまたは1ワード(レジスタのサイズに応じてxbits)を占有します1バイトへのビット-前後)。

型の安全性(値を特定の型のボックスに入れる/ラップするなど)を追加の値のパッキング(ビットシフトや算術を使用するなど)よりも優先することにより、メモリを増やすよりも少ないコードを書くことを効果的に選択します。 (一方、ブール値以外のすべての変換を容易にするカスタムユーザータイプをいつでも定義できます)。

キーワードとタイプ

最後に、あなたの質問はkeywordtypeを比較することです。タイプ(別のキーワードを使用する通常の複合ユーザー定義可能クラス)にキーワード( primitive としてマーク)を使用/優先することにより、パフォーマンスを得る理由または方法を正確に説明することが重要だと思いますclass)または言い換えると

boolean foo = true;

vs.

Boolean foo = true;

最初の「もの」(タイプ)は、理由なしではなく、拡張(サブクラス化)できません。実質的にJavaprimitiveおよびwrappingクラスの用語単純にinlineの値に変換できます(LITERALまたは、置換を推測できる場合、またはそうでない場合はコンパイラーによって直接置換される定数-まだ値をラップするフォールバック)。

些細なことで最適化が達成されます:

「実行時のキャスト操作が少ない=>より高速です。」

そのため、実際の型推論が行われたときに、必要に応じてすべての型情報を使用してラップクラスをインスタンス化する(または変換/キャストする)ことがあります。

そのため、booleanBooleanの違いはCompilationおよびRuntime(少し遠いですが、ほとんどinstanceofとしてvs.getClass())。

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

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

34

Boolean.TRUEおよびBoolean.FALSEの代わりに ブール定数 - 0および1を使用できます。プリミティブが後に続くものであれば、変数をboolean型として作成できます。こうすれば、新しいBooleanオブジェクトを作成する必要がなくなります。

16
CoolBeans

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

boolean b1;
Boolean b2;

b1b2は同じではありません。

3
Sachin Jadhav

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

ブール値プリミティブであることはyesかnoのどちらかを言うことができます。

Booleanはオブジェクトです(yesまたはno、あるいは「わからない」、つまりnullを参照できます)。

1
Sudip Bhandari

あなたはブール/ブールを使用することができます。単純さは進むべき道です。特定の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. オブジェクトが必要なときはBooleanを使います。例えば:

    • ブール値のストリーム、
    • オプション
    • ブール値のコレクション
0
Witold Kaczurba