В чем разница между 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
, но ваш выбор должен основываться на удобочитаемости и базовых проектных решениях, а не на "производительности".
Ответ 3
Boolean
пригодится, когда вам нужна переменная tri-state.
Кроме того, вы можете проверить этот учебник по autoboxing и unboxing, а также правила его работы.
Ответ 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
(и наоборот).