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?
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.
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.
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();
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 --------------
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.
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
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.