Boolean.TRUE == myBoolean против Boolean.TRUE.equals (myBoolean)

Была ли когда-нибудь ситуация, когда использование equals(Boolean) и == возвращало бы разные результаты при работе с Boolean объектами?

Boolean.TRUE == myBoolean;

Boolean.TRUE.equals(myBoolean);

Я здесь не думаю о примитивных типах, а только о логических объектах.


person Edd    schedule 08.05.2013    source источник
comment
вы пробовали использовать несколько экземпляров Boolean?   -  person Marco Forberg    schedule 08.05.2013
comment
myBoolean1 == myBoolean2 где оба равны верно?   -  person Edd    schedule 08.05.2013
comment
Вот почему я задал вопрос: Boolean a1 = true; Boolean a2 = true; System.out.println(a1 == a2);. Результат верный   -  person Edd    schedule 08.05.2013


Ответы (4)


Как насчет:

System.out.println(new Boolean(true) == new Boolean(true));
System.out.println(new Boolean(true) == Boolean.TRUE);

(оба печатают false для по той же причине, что и любой другой тип объектов).

person assylias    schedule 08.05.2013
comment
почему он печатает false? Вы можете объяснить? - person muneebShabbir; 08.05.2013
comment
new Boolean(true) == Boolean.TRUE продемонстрирует проблему еще лучше. - person Marko Topolnik; 08.05.2013
comment
это ложь, потому что мы сравниваем объекты со знаком ==? - person muneebShabbir; 08.05.2013
comment
@muneebShabbir Причина, по которой он печатает false, та же, что и для любого другого объекта: stackoverflow.com/questions/2772763/ - person assylias; 08.05.2013
comment
Спасибо за это ... Я не был уверен, есть ли только два логических объекта, и все ссылки указывают на эти объекты, но я думаю, что нет - person Edd; 08.05.2013

Было бы опасно использовать ==, потому что myBoolean, возможно, не произошел от одной из констант, но был построен как new Boolean(boolValue), и в этом случае == всегда будет приводить к false. Вы можете использовать только

myBoolean.booleanValue()

без участия == и equals, что дает надежные результаты. Если вы также должны учитывать null-значения, тогда нет ничего лучше вашего equals подхода.

person Marko Topolnik    schedule 08.05.2013
comment
Хотя это вернет нас к примитивному значению. - person Menno; 08.05.2013
comment
@Aquillo Ты говоришь так, будто это проблема. Почему это может быть проблемой? Обратите внимание, что результатом любого из выражений OP является одно и то же примитивное логическое значение. - person Marko Topolnik; 08.05.2013
comment
Для меня это было бы возможным решением, а не проблемой. Хотя OP заявил, что его вопрос не в том, чтобы обсуждать обработку примитивов. - person Menno; 08.05.2013
comment
Примитивные значения @MarkoTopolnik - проблема с логическими значениями с тремя состояниями (истина / ложь / ноль) - person John Dvorak; 08.05.2013
comment
@Aquillo OP только указывает, что myBoolean является объектом. - person Marko Topolnik; 08.05.2013
comment
@MarkoTopolnik да ... какой самый короткий способ безопасно сравнить логические значения с тремя состояниями? - person John Dvorak; 08.05.2013
comment
@JanDvorak Нет, вы правы: TRUE.equals(myBoolean) - это кратчайший путь --- но не для сравнения логических значений с тремя состояниями, а для определения того, является ли один таким значением true. - person Marko Topolnik; 08.05.2013
comment
@MarkoTopolnik, только если левая часть является константой или логическим значением с двумя состояниями - person John Dvorak; 08.05.2013
comment
@JanDvorak ... ты имеешь в виду, как в TRUE.equals(myBoolean)? :) - person Marko Topolnik; 08.05.2013
comment
@MarkoTopolnik да, это сработает. Но что, если у вас есть два состояния с тремя состояниями, которые вы хотите проверить на равенство? - person John Dvorak; 08.05.2013
comment
@JanDvorak Тогда вас ждет еще пара символов кода :) left == null? right == null : left.equals(right) - person Marko Topolnik; 08.05.2013
comment
В ruby ​​ни один из TrueClass, FalseClass или NilClass не имеет общедоступного конструктора. - person John Dvorak; 08.05.2013

if (Boolean.TRUE == new Boolean(true)) {
    System.out.println("==");
}

if (Boolean.TRUE.equals(myBoolean)) {
    System.out.println("equals");
}

В этом случае первая ложь. Только второй, если условие верно.

Он печатает:

равно

person Vineet Singla    schedule 08.05.2013

== работает только с примитивными типами
при сравнении объектов всегда следует использовать o.equls(Object ob)

person Kuchi    schedule 08.05.2013