Integer
対int
Java に関する議論があります。前者のデフォルト値はnull
、後者では0
です。どの程度Boolean
対boolean
?
アプリケーションの変数に0
/ 1
値を含めることができます。boolean
/ を使いたいのですが、使いBoolean
たくないint
です。代わりにBoolean
/ を使用できますboolean
か?
Integer
対int
Java に関する議論があります。前者のデフォルト値はnull
、後者では0
です。どの程度Boolean
対boolean
?
アプリケーションの変数に0
/ 1
値を含めることができます。boolean
/ を使いたいのですが、使いBoolean
たくないint
です。代わりにBoolean
/ を使用できますboolean
か?
回答:
はい、代わりにBoolean
/ を使用できますboolean
。
1つ目はオブジェクトで、2つ目はプリミティブ型です。
最初に、あなたは便利になるより多くのメソッドを取得します。
2つ目はメモリ費用を考慮して安価です2つ 目はより多くのメモリを節約できるので、それを試してください
今あなたの方法を選択してください。
AsyncTask
、のBoolean
代わりにのみ使用できますboolean
。
true
、false
とnull
ブール論理2つの状態を持つ(true
とfalse
)
Boolean
ブールプリミティブ型をラップします。JDK 5以降では、Oracle(またはOracleが購入する前のSun)がautoboxing / unboxingを導入しました。これにより、基本的にこれを行うことができます
boolean result = Boolean.TRUE;
または
Boolean result = true;
これは本質的にコンパイラーが行いますが、
Boolean result = Boolean.valueOf(true);
だから、あなたの答えはYESです。
Boolean
とは限りませんboolean
。あなたの場合Boolean
ですnull
と、あなたがそれを割り当てようとboolean
、それがスローされますNullPointerException
実行時。
Boolean
クラスの場合、同じブール変数を参照している別のクラスから値を変更しても、値が常にfalseになるのはなぜですか?Boolean
異なるインスタンスクラスから参照できない場合/引数として渡すことができない場合、これの意味は何ですか?
AtomicBoolean
たら、差分クラスから使用して参照できます
これまでのところ、彼らは、特定の言語のプログラミングの代わりのシーンの背後にある大きな絵の世話をしに焦点を当て、彼らの「自分」/人工用語に集中するので、私は(ビットが提供する答えを拡張していますプログラミング言語を作成し、一般的に、すなわちときの事、型安全性とメモリの考慮が違いを生むように):
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または定数-まだ値をラップするためのフォールバック)に単純に変換できます。
最適化は簡単なために達成されます:
「実行時のキャスト操作が少ない=>速度が向上しました。」
そのため、実際の型推論が行われると、必要に応じて、ラッピングクラスがすべての型情報でインスタンス化(または変換/キャスト)されることになります。
したがって、ブール値とブール値の違いは、コンパイルとランタイムにあります(少し遠いですが、ほとんどinstanceofとgetClass()が同じです)。
最後に、オートボクシングはプリミティブよりも遅い
Javaがオートボクシングを実行できるという事実は、単なる「構文上の砂糖」であることに注意してください。それは何もスピードアップせず、より少ないコードを書くことを可能にします。それでおしまい。タイプ情報コンテナへのキャストとラップは引き続き実行されます。パフォーマンス上の理由から、型の安全性を実装するために、型情報を持つクラスインスタンスを作成する余分なハウスキーピングを常にスキップする算術を選択してください。型安全性の欠如は、パフォーマンスを得るために支払う代償です。ブール値の式を使用するコードの場合、型の安全性(より少ない、つまり暗黙的なコードを記述する場合)は、if-then-elseフロー制御などでは重要です。
ブール/ブールを使用できます。シンプルさが進むべき道です。特定のAPI(コレクション、ストリームなど)を必要とせず、それらが必要になると予測していない場合は、そのプリミティブバージョン(ブール値)を使用します。
プリミティブを使用すると、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;
}
オブジェクトが必要な場合はブール値を使用します。例: