web-dev-qa-db-ja.com

ブール値を比較するには?

これを例にとります( 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()は適用されません。

また、Booleanbooleanとは異なる方法で処理する必要がありますか?

29
ylun.ca

あなたのコメントから、Booleanラッパークラスを使用するための「ベストプラクティス」を探しているようです。しかし、このクラスを最初から使用するのは悪い考えであるため、ベストプラクティスは実際にはありません。オブジェクトラッパーを使用する唯一の理由は、絶対にmustGenerics を使用する場合など) HashMap<String, Boolean>などのbooleanなど)。オブジェクトラッパーを使用することには、利点も欠点もありません。最も顕著なのは、NullPointerExceptionsにアクセスできることです。

「!」ブールの.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;

しかし、真剣に...強制されない限り、プリミティブ型を使用してください。

18
asteri

これを試して:

if (Boolean.TRUE.equals(yourValue)) { ... }

追加の利点として、これはヌルセーフです。

51
yglodt

直接条件(==、!= 、! conditionなど)を使用すると、オブジェクトからメソッドを呼び出す場合と直接比較が直接実行される場合のように、.equals(condition)よりもわずかにパフォーマンスが向上します。

2
ucsunil

直接操作とメソッド.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を比較するために_==_を使用した方がよいと言えます。

2
ylun.ca

checkernullでない限り、投稿どおり!checkerを使用できます。これはJava 5以降で可能です。これは、このBoolean変数がprimivite boolean値に自動ボックス化されるためです。

2
Luiggi Mendoza

.equals(false)は、より速い構文を使用するのではなく、オブジェクトの仮想メソッドを呼び出しているため遅くなり、一般的に使用されるコード標準は実際にそれを行うことを前提としないため、ほとんどのプログラマーによって予期されない.equals(false)メソッドで確認してください。

1
Migol

オブジェクトとして?

等しい

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

1
CamelTM