Подтвердить что ты не робот

Как сравнить Boolean?

Возьмите это, например, (выдержка из Java regex checker не работает):

while(!checker) {
    matcher = pattern.matcher(number);
    if(matcher.find())
        checker = true;
    else
        year++;
}

Было бы важно, чтобы .equals(false) использовался для проверки значения Boolean checker?

Я знаю, что есть этот, который довольно схож. Однако, очевидно, вопрос касается примитивного boolean, а не обертки объекта, boolean; таким образом, .equals() не применимо.

Кроме того, если boolean обрабатывается иначе, чем boolean?

4b9b3361

Ответ 1

Из ваших комментариев кажется, что вы ищете "лучшие практики" для использования класса-оболочки Boolean. Но на самом деле не существует каких-либо лучших практик, потому что это плохая идея использовать этот класс для начала. Единственная причина использовать обертку объекта - это те случаи, когда вы абсолютно должны (например, при использовании Generics, то есть, сохраняя Boolean в HashMap<String, Boolean> или тому подобное). Использование обертки объекта не имеет никаких повышений и большого количества недостатков, особенно в том, что оно открывает вас до NullPointerException s.

Имеет ли значение, если '!' используется вместо .equals() для булевых?

Оба метода будут восприимчивы к a NullPointerException, поэтому это не имеет значения в этом отношении. В первом сценарии Boolean будет unboxed в соответствующее значение Boolean и сравнится как обычно. Во втором сценарии вы вызываете метод из класса Boolean, который следующий:

public boolean equals(Object obj) {
    if (obj instanceof Boolean) {
        return value == ((Boolean)obj).booleanValue();
    }
    return false;
}

В любом случае результаты одинаковы.

Будет ли иметь значение, если для проверки значения логической проверки было использовано .equals(false)?

Выше, нет.

Вторичный вопрос: должно ли Boolean обрабатываться иначе, чем boolean?

Если вы абсолютно должны использовать класс 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-circuit условные оценки. Вы также можете использовать тернарный оператор.

boolean easyToUseValue = value != null ? value : false;

Но серьезно... просто используйте примитивный тип, если только вы не должны этого делать.

Ответ 2

Попробуйте следующее:

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

В качестве дополнительного преимущества это является нулевым.

Ответ 3

Пока checker не null, вы можете использовать !checker как опубликовано. Это возможно, так как Java 5, потому что эта переменная Boolean будет автобоксирована в значение primivite Boolean.

Ответ 4

Использование прямых условий (например, ==,! =,! condition) будет иметь небольшое улучшение производительности по сравнению с .equals(condition), как в одном случае, вы вызываете метод от объекта, тогда как прямые сравнения выполняются напрямую.

Ответ 5

.equals(false) будет медленнее, потому что вы вызываете виртуальный метод для объекта, а не используете более быстрый синтаксис и довольно неожиданны для большинства программистов, потому что обычно используются стандартные стандарты кода, которые не предполагают, что вы должны делать эту проверку с помощью метода .equals(false).

Ответ 6

Относительно производительности прямых операций и метода .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.

Ответ 7

Как объект?

равно

public boolean equals (Object obj)

Возвращает true тогда и только тогда, когда аргумент не является нулевым и является булевым объектом, который представляет то же логическое значение, что и этот объект.

Заменяет:   равно в классе Object

Параметры:   obj - объект для сравнения с.

Возвращает:   true, если логические объекты представляют одно и то же значение; false в противном случае.

boolean a = true;
boolean b = false;

System.out.println("a.equals(b):" + ((Object)a).equals( ((Object)b) ));

Выход: a.equals(b): false