web-dev-qa-db-fra.com

Meilleure approche pour convertir un objet booléen en chaîne en java

J'essaie de convertir un booléen en type de chaîne ...

Boolean b = true;
String str = String.valueOf(b);

ou

Boolean b = true;
String str = Boolean.toString(b);

lequel des éléments ci-dessus serait plus efficace? 

95
Rachel

Je ne pense pas qu'il y aurait une différence de performance significative entre eux, mais je préférerais la 1ère voie.

Si vous avez une référence Boolean, Boolean.toString(boolean) lancera NullPointerException si votre référence est null. Comme la référence est décochée à boolean avant d'être passée à la méthode.

Alors que, comme le montre le code source, la méthode String.valueOf(), la vérification explicite null:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Il suffit de tester ce code:

Boolean b = null;

System.out.println(String.valueOf(b));    // Prints null
System.out.println(Boolean.toString(b));  // Throws NPE

Pour les booléens primitifs, il n'y a pas de différence.

137
Rohit Jain

Si vous êtes sûr que votre valeur n’est pas null, vous pouvez utiliser la troisième option qui est

String str3 = b.toString();

et son code ressemble à

public String toString() {
    return value ? "true" : "false";
}

Si vous voulez être null-safe, utilisez String.valueOf(b) à quoi le code ressemble

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

donc, comme vous le voyez, il va d'abord tester null et ensuite invoquer la méthode toString() sur votre objet. 


Appeler Boolean.toString(b) invoquera 

public static String toString(boolean b) {
    return b ? "true" : "false";
}

ce qui est un peu plus lent que b.toString() puisque JVM doit d'abord unboxBoolean à boolean qui sera passé comme argument à Boolean.toString(...), pendant que b.toString() réutilise le champ private boolean value dans l'objet Boolean qui conserve son état.

24
Pshemo

Si ceci a pour but d'obtenir une valeur "vraie" constante, plutôt que "vraie" ou "vraie", vous pouvez utiliser ceci:

Boolean.TRUE.toString();
Boolean.FALSE.toString();
3
Shashank
public class Sandbox {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Boolean b = true;
        boolean z = false;
        echo (b);
        echo (z);
        echo ("Value of b= " + b +"\nValue of z= " + z);
    }

    public static void echo(Object obj){
        System.out.println(obj);
    } 

}
Result
--------------
true
false
Value of b= true
Value of z= false
--------------
3
user4417223

Si vous cherchez un moyen rapide de le faire, par exemple le débogage, vous pouvez simplement concaténer une chaîne vide sur le booléen:

System.out.println(b+"");

Cependant, je recommande fortement d'utiliser une autre méthode pour une utilisation en production. C'est une solution simple et rapide qui est utile pour le débogage.

1
jskidd3

Cela dépend de ce que vous entendez par "efficace". En ce qui concerne les performances, les deux versions sont identiques au même code octet.

$ ./javap.exe -c Java.lang.String | grep -A 10 "valueOf(boolean)"
  public static Java.lang.String valueOf(boolean);
    Code:
       0: iload_0
       1: ifeq          9
       4: ldc           #14                 // String true
       6: goto          11
       9: ldc           #10                 // String false
      11: areturn


$ ./javap.exe -c Java.lang.Boolean | grep -A 10 "toString(boolean)"
  public static Java.lang.String toString(boolean);
    Code:
       0: iload_0
       1: ifeq          9
       4: ldc           #3                  // String true
       6: goto          11
       9: ldc           #2                  // String false
      11: areturn
1
kmera

Si vous voyez la mise en œuvre des deux méthodes, elles ont le même aspect.

String.valueOf (b)

public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

Boolean.toString (b)

public static String toString(boolean b) {
        return b ? "true" : "false";
    }

Les deux méthodes sont donc tout aussi efficaces.

0
singh30