これを例にとります( Java regex checker not working )からの抜粋:
_while(!checker) {
matcher = pattern.matcher(number);
if(matcher.find())
checker = true;
else
year++;
}
_
_Boolean checker
_の値を確認するために.equals(false)
が使用されたかどうかは重要ですか?
this があることを知っていますが、これはかなり似ています。ただし、この質問では、オブジェクトラッパーboolean
ではなく、プリミティブBoolean
を扱います。したがって、.equals()
は適用されません。
また、Boolean
をboolean
とは異なる方法で処理する必要がありますか?
あなたのコメントから、Boolean
ラッパークラスを使用するための「ベストプラクティス」を探しているようです。しかし、このクラスを最初から使用するのは悪い考えであるため、ベストプラクティスは実際にはありません。オブジェクトラッパーを使用する唯一の理由は、絶対にmust( Generics を使用する場合など) HashMap<String, Boolean>
などのboolean
など)。オブジェクトラッパーを使用することには、利点も欠点もありません。最も顕著なのは、NullPointerException
sにアクセスできることです。
「!」ブールの.equals()の代わりに使用されますか?
どちらの手法もNullPointerException
の影響を受けやすいため、その点では重要ではありません。最初のシナリオでは、Boolean
は、それぞれのboolean
値に nboxed になり、通常どおり比較されます。 2番目のシナリオでは、Boolean
クラスからメソッドを呼び出しています。このクラスは 以下 です。
public boolean equals(Object obj) {
if (obj instanceof Boolean) {
return value == ((Boolean)obj).booleanValue();
}
return false;
}
どちらにしても、結果は同じです。
ブールチェッカーの値を確認するために.equals(false)が使用された場合、問題になりますか?
上記ごとに、いいえ。
二次的な質問:ブールはブールとは異なる方法で処理されるべきですか?
絶対にmustを使用する場合は、Boolean
クラスを使用し、比較を実行する前に必ずnull
を確認してください。例えば。、
Map<String, Boolean> map = new HashMap<String, Boolean>();
//...stuff to populate the Map
Boolean value = map.get("someKey");
if(value != null && value) {
//do stuff
}
Java short-circuits 条件付き評価。三項演算子を使用することもできます。
boolean easyToUseValue = value != null ? value : false;
しかし、真剣に...強制されない限り、プリミティブ型を使用してください。
これを試して:
if (Boolean.TRUE.equals(yourValue)) { ... }
追加の利点として、これはヌルセーフです。
直接条件(==、!= 、! conditionなど)を使用すると、オブジェクトからメソッドを呼び出す場合と直接比較が直接実行される場合のように、.equals(condition)よりもわずかにパフォーマンスが向上します。
直接操作とメソッド.equals()
のパフォーマンスに関して。 .equals()
メソッドは、おおよそ_==
_より4倍遅いようです。
次のテストを実行しました。
_==
_のパフォーマンス:
_public class BooleanPerfCheck {
public static void main(String[] args) {
long frameStart;
long elapsedTime;
boolean heyderr = false;
frameStart = System.currentTimeMillis();
for (int i = 0; i < 999999999; i++) {
if (heyderr == false) {
}
}
elapsedTime = System.currentTimeMillis() - frameStart;
System.out.println(elapsedTime);
}
}
_
および.equals()
のパフォーマンス:
_public class BooleanPerfCheck {
public static void main(String[] args) {
long frameStart;
long elapsedTime;
Boolean heyderr = false;
frameStart = System.currentTimeMillis();
for (int i = 0; i < 999999999; i++) {
if (heyderr.equals(false)) {
}
}
elapsedTime = System.currentTimeMillis() - frameStart;
System.out.println(elapsedTime);
}
}
_
_==
_の合計システム時間は_1
_でした
.equals()
の合計システム時間は_3 - 5
_から変化しました
したがって、.equals()
はパフォーマンスを低下させ、ほとんどの場合、Boolean
を比較するために_==
_を使用した方がよいと言えます。
checker
がnull
でない限り、投稿どおり!checker
を使用できます。これはJava 5以降で可能です。これは、このBoolean
変数がprimivite boolean
値に自動ボックス化されるためです。
.equals(false)
は、より速い構文を使用するのではなく、オブジェクトの仮想メソッドを呼び出しているため遅くなり、一般的に使用されるコード標準は実際にそれを行うことを前提としないため、ほとんどのプログラマーによって予期されない.equals(false)
メソッドで確認してください。
オブジェクトとして?
等しい
public boolean equals(Object obj)
引数がnullではなく、このオブジェクトと同じブール値を表すブールオブジェクトである場合にのみtrueを返します。
オーバーライド:クラスObjectに等しい
パラメータ:obj-比較するオブジェクト。
戻り値:Booleanオブジェクトが同じ値を表す場合はtrue。そうでない場合はfalse
boolean a = true;
boolean b = false;
System.out.println("a.equals(b):" + ((Object)a).equals( ((Object)b) ));
出力:a.equals(b):false