web-dev-qa-db-fra.com

Quelle est la différence entre false et Boolean.FALSE?

En C++, windows.h FALSE est défini comme un entier, ce qui est logique pour certains cas de logique particuliers, mais en Java, Java.lang.Boolean.FALSE est défini comme booléen et attribué à false.
public static final Boolean FALSE et j'ai vu certaines personnes l'utiliser.

Ma question: existe-t-il une différence de performance entre false et Boolean.FALSE? en général pourquoi les gens vont-ils et Boolean.FALSE?

19

Voir http://docs.Oracle.com/javase/7/docs/api/Java/lang/Boolean.html .

Boolean.TRUE et Boolean.FALSE ne sont pas boolean, ils sont Boolean. Ce sont des instances statiques des deux objets wrapper Boolean qui correspondent aux valeurs booleantrue et false

Boolean est similaire à un enum. Les instances TRUE et FALSE sont les instances renvoyées par Boolean.valueOf() .

En ce qui concerne la performance de primitive vs wrapper; il n'y a aucune différence qui vous préoccupe un jour. Les instances statiques TRUE et FALSE améliorent un peu les performances, et les javadocs recommandent d'utiliser Boolean.valueOf() au lieu de new Boolean(...) pour cette raison. Les valeurs booléennes true et false sont un peu "de niveau inférieur", mais si vous les stockez dans un Boolean (par opposition à boolean), de toute façon, ce n'est pas pertinent.

Vous devez utiliser celui qui convient le mieux à votre code et qui conduit à une meilleure lisibilité (et ne vous engagez absolument pas dans la voie de la réflexion sur la microoptimisation, comme les types primitif par rapport aux types wrapper). Si vous utilisez un Boolean, utilisez les valeurs d'objet. Si vous utilisez un boolean, utilisez les valeurs primitives. Si vous choisissez entre Boolean et boolean, utilisez ce qui convient le mieux (par exemple, un Boolean peut être null, ce qui peut être utile, et vous ne pouvez pas utiliser de types primitifs pour les paramètres de type générique; d'autre part, un boolean peut jamais être null qui pourrait être tout aussi utile).

Notez également que la boxe automatique convertit les types primitifs en l'une de ces deux instances statiques Boolean, par exemple:

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



En passant, puisque vous l'avez mentionné: FALSE est défini dans windows.h pour deux raisons: 1) Parce que windows.h est utilisé depuis la semaine C et que C n'a pas de type natif bool et 2) il s'agit de la pratique traditionnelle de Microsoft. définir des types de données et des valeurs avec des tailles et des valeurs connues et explicites, en particulier pour transmettre des données aux fonctions de l'API Windows à travers DLL limites (au-delà du cadre de cette question) et pour l'intégration à d'autres langages ayant des représentations différentes de "true" et "false". Cela n'a aucun rapport avec les raisons de Boolean.FALSE en Java.

30
Jason C

false est une primitive et Boolean.FALSE est un objet, ils ne sont donc pas vraiment comparables.

Si vous affectez false à une variable Boolean, procédez comme suit:

Boolean b = false;

La boîte automatique de Java convertit la primitive en objet, ainsi la valeur false est perdue et vous vous retrouvez avec Boolean.FALSE de toute façon.

En termes de performances, utiliser une variable primitive serait légèrement plus performant en utilisant un objet wrapper Boolean, mais votre choix devrait être basé sur la lisibilité et les décisions de conception de base plutôt que sur la "performance".

5
Bohemian

Boolean est pratique lorsque vous avez besoin d'une variable à trois états.

En outre, vous voudrez peut-être consulter ce tutoriel de sélection automatique et unboxing , ainsi que les règles pour savoir comment cela fonctionne .

4
GGrec

C'est une question très étrange, parce que false est la valeur du type primitif boolean, tandis que Boolean.FALSE est une variable de type référence Boolean. Sa valeur fait référence à l'objet de type Boolean dont l'état booléen interne est false.

1
Andremoniy

En ce qui concerne les performances, Boolean.FALSE renverra un objet Boolean, ce qui vous donnera peut-être plus de flexibilité pour travailler.

L'alternative primitive utilise moins de mémoire

1
Alex Vulaj

Boolean est une classe wrapper pour le type primitif booléen, identique à Integer pour int.

Boolean a beaucoup de méthodes pour jouer avec le type primitif boolean

http://docs.Oracle.com/javase/6/docs/api/Java/lang/Boolean.html

0
pappu_kutty
Boolean a = null;
if (a) {
   // NullPointerException
}
if (a != false) {
   // NullPointerException
}
// Caution, comparing by reference, meaning 2 Booleans with same value could be different
if (a != Boolean.FALSE) {
    System.out.println("But this one works"); 
}
0
deathangel908

Tout d’abord, si vous n'êtes pas sûr de cela, vous devez savoir qu’en Java, les valeurs numériques ne peuvent pas être converties implicitement en booléens, par exemple. vous ne pouvez pas compiler quelque chose comme:

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

Deuxièmement, quelques considérations sur les performances. Il y a toujours un compromis.

Lorsque vous utilisez le type primitif boolean, les performances devraient être meilleures, car vous utilisez directement value , qui est soit true, soit false (de toute évidence, codé en octets).

Lorsque vous utilisez le type d'objet Boolean, une variable/un champ contiendra une valeur, mais cette valeur ne peut pas être utilisée immédiatement, car cette valeur est en fait la référence à un objet et peut entraîner une pénalité de performances. Bien entendu, cette sanction n’est pas significative dans la plupart des cas. Et si vous développez une application urgente, vous n'utiliserez probablement pas Java :). Néanmoins, l’utilisation de types d’objets peut présenter certains avantages pour le processus de développement et la sécurité dans l’implémentation des cas d’utilisation (par exemple, elle autorise les valeurs NULL, ce qui est essentiel lorsque vous mappez des entités JPA à des tables relationnelles et que des colonnes à type de bit autorisent les valeurs NULL. un scénario où le type d'objet est meilleur).

En fin de compte, soyez conscient de la boxing/un-boxing, qui permet aux développeurs d'utiliser des variables de type boolean- presque partout où une variable de type Boolean- est attendue (et inversement).

0
Andrei Nicusan