Booléen vs booléen en Java

Il y a des discussions autour d’ Integer vs int en Java. La valeur par défaut de la première est null alors que dans la seconde, elle est null . Que diriez-vous de Boolean vs boolean ?

Une variable dans mon application peut avoir des valeurs 0/1. Je voudrais utiliser boolean / Boolean et préfère ne pas utiliser int . Puis-je utiliser Boolean / Boolean place?

Oui, vous pouvez utiliser Boolean / Boolean place.

Le premier est Object et le second est le type primitif.

  • Sur le premier, vous obtiendrez plus de méthodes qui seront utiles.

  • Le second est bon marché compte tenu de la dépense de mémoire Le second vous fera économiser beaucoup plus de mémoire, alors allez-y

Maintenant, choisissez votre chemin.

Boolean enveloppe le type primitif booléen. Dans JDK 5 et plus, Oracle (ou Sun avant l’achat d’Oracle) a introduit l’ autoboxing / unboxing , ce qui vous permet essentiellement de le faire.

 boolean result = Boolean.TRUE; 

ou

 Boolean result = true; 

Ce qui fait essentiellement le compilateur,

 Boolean result = Boolean.valueOf(true); 

Donc, pour votre réponse, c’est OUI.

Je prends un peu de temps les réponses fournies (car jusqu’à présent, ils se concentrent sur leur propre “/ terminologie” artificielle en se concentrant sur la programmation d’une langue particulière au lieu de se préoccuper de la création des langages de programmation , en général comme la sécurité de type par rapport aux considérations de mémoire font la différence):

int n’est pas booléen

Considérer

  boolean bar = true; System.out.printf("Bar is %b\n", bar); System.out.printf("Bar is %d\n", (bar)?1:0); int baz = 1; System.out.printf("Baz is %d\n", baz); System.out.printf("Baz is %b\n", baz); 

avec sortie

  Bar is true Bar is 1 Baz is 1 Baz is true 

Le code Java sur la 3ème ligne (bar)?1:0 illustre que la barre ( booléenne ) ne peut pas être convertie (convertie) implicitement dans un int . Je soulève cette question, non pas pour illustrer les détails de la mise en œuvre derrière JVM, mais pour souligner que, en termes de considérations de bas niveau (comme la taille de la mémoire), il faut préférer les valeurs à la sécurité de type. Surtout si ce type de sécurité n’est pas vraiment / complètement utilisé comme dans les types booléens où les contrôles sont effectués sous forme de

si la valeur \ dans {0,1} est alors convertie en type booléen, sinon, lancez une exception.

Tout simplement pour dire que {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Semble comme un excès, non? La sécurité de type est vraiment importante dans les types définis par l'utilisateur, pas dans la diffusion implicite de primitives (bien que les dernières soient incluses dans la première).

Les octets ne sont ni des types ni des bits

Notez qu’en mémoire, votre variable de la plage {0,1} occupera toujours au moins un octet ou un mot (xbits en fonction de la taille du registre), sauf si cela a été spécialement pris en compte (par exemple, bien emballé en mémoire – 8 ” bits dans 1 octet – d’avant en arrière).

En préférant la sécurité de type (comme mettre / encapsuler une valeur dans une boîte d’un type particulier) sur un emballage de valeur supplémentaire (par exemple en utilisant des décalages de bits ou une arithmétique), on choisit effectivement d’écrire moins de code pour gagner plus de mémoire. (D’un autre côté, on peut toujours définir un type d’utilisateur personnalisé qui facilitera toute la conversion qui ne vaut pas que booléenne).

mot-clé ou type

Enfin, votre question concerne la comparaison entre mot-clé et type . Je pense qu’il est important d’expliquer pourquoi ou comment vous obtiendrez des performances en utilisant / préférant les mots-clés (“marqués” comme primitifs ) sur les types (classes normalisées définies par l’utilisateur composites utilisant une autre classe de mots clés) ou en d’autres termes

 boolean foo = true; 

contre.

 Boolean foo = true; 

La première “chose” (type) ne peut pas être étendue (sous-classée) et non sans raison. En effet, la terminologie Java des classes primitives et des classes enveloppantes peut être simplement traduite en une valeur inline (un LITERAL ou une constante qui est directement substituée par le compilateur chaque fois qu’il est possible de déduire la substitution ou sinon).

L’optimisation est obtenue grâce à la simplicité:

“Moins d’opérations de casting à l’exécution => plus de vitesse.”

C’est pourquoi lorsque l’inférence de type réelle est effectuée, elle peut (encore) se retrouver dans l’instanciation de la classe d’encapsulation avec toutes les informations de type si nécessaire (ou la conversion / conversion en une telle).

Donc, la différence entre booléen et booléen est exactement dans Compilation et Runtime (un peu loin mais presque comme instanceof contre getClass () ).

Enfin, l’autoboxing est plus lent que les primitives

Notez que le fait que Java puisse faire de l’ autoboxing n’est qu’un “sucre syntaxique”. Il n’accélère rien, vous permet simplement d’écrire moins de code. C’est tout. Le moulage et l’emballage dans le conteneur d’informations de type sont toujours effectués. Pour des raisons de performances, choisissez une arithmétique qui ignorera toujours la gestion des occurrences de classes avec des informations de type pour implémenter la sécurité de type. Le manque de sécurité de type est le prix que vous payez pour gagner en performance. Pour le code avec des expressions à valeur booléenne, le type de sécurité (lorsque vous écrivez moins et donc le code implicite ) serait essentiel, par exemple pour les contrôles de stream if-then-else.

Vous pouvez utiliser les constantes booléennes – Boolean.TRUE et Boolean.FALSE au lieu de 0 et 1 . Vous pouvez créer votre variable de type boolean si vous êtes un utilisateur primitif. De cette façon, vous ne devrez pas créer de nouveaux objects Boolean .

Fondamentalement, booléen représente un type de données primitif où Booléen représente un type de données de référence. cette histoire est lancée lorsque Java veut devenir purement orienté object, il est fourni un concept de classe wrapper pour utiliser un type de données primitif.

 boolean b1; Boolean b2; 

b1 et b2 ne sont pas les mêmes.

La classe java.lang.Boolean enveloppe une valeur du type primitif boolean dans un object. Un object de type booléen contient un seul champ dont le type est booléen

Voici la déclaration, la classe finale publique Boolean étend les implémentations d’objects Serializable, Comparable