Как сравнить 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
?
Ответы
Ответ 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