В чем разница между false и Boolean.FALSE?

В С++ windows.h FALSE определяется как целое, что имеет смысл для некоторых особых логических случаев, но в Java java.lang.Boolean.FALSE определяется как логическое и присваивается false
public static final Boolean FALSE, и я видел, как некоторые люди его использовали.

Мой вопрос: есть ли разница в производительности между false и Boolean.FALSE? в общем, почему люди идут и Boolean.FALSE?

Ответы

Ответ 1

См. http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html.

Boolean.TRUE и Boolean.FALSE не boolean, они boolean. Это статические экземпляры двух объектов оболочки boolean, которые соответствуют значениям boolean true и false.

boolean похож на enum. Экземпляры true и false являются экземплярами, возвращаемыми Boolean.valueOf().

Что касается производительности примитивной vs. wrapper; нет никакой разницы, о которой вам когда-либо понадобилось бы беспокоиться. Статические экземпляры true и false поддерживают производительность немного, и javadocs рекомендует использовать Boolean.valueOf() вместо new Boolean(...) по этой причине. Булевские значения true и false немного "нижнего уровня", но если вы сохраняете их в boolean (в отличие от boolean), в любом случае это не имеет значения.

Вы должны использовать то, что имеет наибольшее значение для вашего кода и ведет к лучшей читаемости (и, безусловно, не начнет идти по пути мышления микрооптимизации, типа примитивных и оболочечных типов). Если вы используете boolean, используйте значения объекта. Если вы используете boolean, используйте примитивные значения. Если вы решаете между boolean vs boolean, используйте все, что более подходит (например, boolean может быть null, что может быть полезно, а также вы не можете использовать примитивные типы для параметров типового типа; с другой стороны, a boolean никогда не может быть null, что может быть одинаково полезно).

Также обратите внимание, что автоматический бокс преобразует примитивные типы в один из двух статических экземпляров boolean, например:

Boolean a = true;
assert(a == Boolean.TRUE);



В качестве стороннего, поскольку вы упомянули об этом: false определяется в windows.h по двум причинам: 1) Поскольку windows.h используется с C-only days, а C не имеет нативного bool, и 2) традиционная практика Microsoft определяет типы и значения данных с известными, явными размерами и значениями, особенно. для передачи данных в функции Windows API через границы DLL (вне сферы действия этого вопроса) и для интеграции с другими языками, которые имеют разные представления "true" и "false". Он полностью не связан с причинами Boolean.FALSE в Java.

Ответ 2

false является примитивным, а Boolean.FALSE является объектом, поэтому они не очень сопоставимы.

Если вы назначаете false переменной Boolean, например:

Boolean b = false;

Java-бокс происходит для преобразования примитива в объект, поэтому значение false теряется, и вы все равно получаете Boolean.FALSE.

С точки зрения производительности, использование примитивной переменной будет немного выходить из-за использования объекта-оболочки Boolean, но ваш выбор должен основываться на удобочитаемости и базовых проектных решениях, а не на "производительности".

Ответ 4

Это очень странный вопрос, потому что false - это значение примитивного типа boolean, а Boolean.FALSE - переменная ссылочного типа boolean. Его значением является ссылка на объект типа boolean, внутреннее логическое состояние которого false.

Ответ 5

Что касается производительности, Boolean.FALSE вернет объект Boolean, что может дать вам больше гибкости в работе.

Примитивная альтернатива занимает меньше памяти

Ответ 6

Boolean - это класс-оболочка для логического примитивного типа, такой же, как у Integer для int.

Boolean имеет множество способов играть вокруг примитивного типа Boolean

http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html

Ответ 7

Прежде всего, если вы неясны с этим, вам нужно знать, что в Java числовые данные не могут быть неявно переданы в booleans, например. вы не можете скомпилировать что-то вроде:

int a = 1;
if(a){
    //something, something
}

Во-вторых, некоторые соображения о производительности. Всегда есть компромисс.

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

При использовании типа объекта boolean переменная/поле будет содержать значение, но это значение не может быть немедленно использовано, поскольку это значение на самом деле является ссылкой на объект, поэтому у вас может быть ограничение производительности. Конечно, это наказание не является значительным в большинстве случаев. И, если вы разрабатываете критичное по времени приложение, скорее всего, вы не используете Java:). Тем не менее использование типов объектов может привести к некоторым преимуществам в процессе разработки и безопасности в реализации прецедентов (например, он допускает нулевые значения, что имеет решающее значение при сопоставлении объектов JPA с реляционными таблицами, и есть столбцы с битовым типом, которые допускают значения null, и это только один сценарий, где тип объекта лучше).

В конце концов, будьте в курсе бокса/un-бокса, который позволяет разработчикам использовать переменные типа boolean почти везде, где ожидается переменная типа boolean (и наоборот).