web-dev-qa-db-fra.com

== vérifie-t-il l'égalité complète dans les booléens? - Java

J'ai donc entendu dire que si je compare 2 chaînes avec == alors je ne reviendrai que si elles se réfèrent toutes deux au même objet/instance. Ce sont des chaînes. Et les booléens?

25
Bluefire

== vérifie-t-il l'égalité complète dans les booléens? - Java

Cela dépend si vous parlez de Booleans (l'encapsuleur d'objet, notez la majuscule B) ou booleans (la primitive, notez la minuscule b). Si vous parlez de Booleans (l'encapsuleur d'objets), comme pour tous les objets, == Vérifie identité, pas équivalence. Si vous parlez de booleans (primitives), il vérifie l'équivalence.

Donc:

Boolean a, b;
a = new Boolean(false);
b = new Boolean(false);
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance

Mais

boolean c, d;
c = false;
d = false;
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value

Concernant les cordes:

J'ai entendu dire que si je compare 2 chaînes avec ==, je ne reviendrai que si les chaînes sont identiques et qu'elles se réfèrent toutes deux au même objet/instance ...

Ce n'est pas vraiment un "et": == Va seulement vérifier si les deux String variables font référence à la même String instance. Bien sûr, une instance String ne peut avoir qu'un seul ensemble de contenu, donc si les deux variables pointent vers la même instance, naturellement le contenu est le même ... :-) Le point clé est que == signalera false pour différentString instances même si elles ont les mêmes caractères dans le même ordre. C'est pourquoi nous utilisons equals sur eux, pas ==. Les chaînes peuvent devenir un peu déroutantes à cause de interning , qui est spécifique aux chaînes (il n'y a pas d'équivalent pour Boolean, bien que lorsque vous utilisez Boolean.valueOf(boolean) , vous obtiendrez un objet mis en cache). Notez également que Java n'a pas de chaînes primitives comme il en a primitif boolean, int, etc.

43
T.J. Crowder

Si vous avez un objet, l'utilisation est égale, sinon vous pouvez exécuter des choses comme celle-ci. (Cache VM pour les primitives d'autoboxing)

    public static void main(String[] args){
       Boolean a = true;
       Boolean b = true;
       System.out.println(a == b);
       a = new Boolean(true);
       b = new Boolean(true);
       System.out.println(a == b);
   }

la sortie est TRUE et FALSE

3
kaytastrophe

Cela dépend si vous parlez de types de valeurs comme: int, boolean, long ou des types de référence: Integer, Boolean, Long. les types de valeurs peuvent être comparés à ==, les types de référence doivent être comparés à equals.

1
0lukasz0

Lorsque vous utilisez (==) avec des booléens,

  1. Si l'un des opérandes est un wrapper booléen, il est d'abord déballé dans une primitive booléenne et les deux sont comparés.

  2. Si les deux sont des wrappers booléens, créés avec le mot-clé 'new', leurs références sont comparées comme dans le cas d'autres objets. new Boolean("true") == new Boolean("true") est faux

  3. Si les deux sont des wrappers booléens, créés sans le mot-clé "new",

    Boolean a = false;
    Boolean b = Boolean.FALSE;
    // (a==b) return true
    
0
Yuresh Karunanayake