2013-09-16 8 views
80

Ich versuche, boolean String-Typen ... wäre effizientbester Ansatz für Boolesche Objekt String in Java Umwandlung

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

oder

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

das ein von oben zu konvertieren?

+0

Haben Sie sich den * Quellcode * dieser beiden Methoden angesehen? –

+1

Ich bevorzuge "" "+ b". Es ist langsamer, aber effizienter für den Entwickler. Wenn Sie Spitzenleistung wollen, können Sie die Daten in/aus einem direkten ByteBuffer schreiben, d. H. Ändern, was Sie mit dem String tun, damit Sie ihn nicht brauchen. –

Antwort

113

Ich glaube nicht, dass es einen signifikanten Leistungsunterschied zwischen ihnen geben würde, aber ich würde den 1. Weg bevorzugen.

Wenn Sie eine Boolean Referenz haben, wird Boolean.toString(boolean) werfen NullPointerException wenn Ihre Referenz null ist. Da die Referenz auf boolean entpackt ist, bevor sie an die Methode übergeben wird.

Während String.valueOf() Verfahren wie die Code zeigt Quelle, macht die explizite null Prüfung:

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

einfach diesen Code testen:

Boolean b = null; 

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

Für primitive boolean, gibt es keinen Unterschied .

20

Wenn Sie sicher sind, dass Ihr Wert nicht null ist, können Sie dritte Option verwenden, die

ist
String str3 = b.toString(); 

und seinen Code sieht aus wie

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

Wenn Sie Null- sein wollen sichere Verwendung String.valueOf(b) welcher Code aussieht wie

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

so wie Sie sehen, wird es zunächst für null und später auf toString() Methode auf Ihr Objekt zu testen.


Boolean.toString(b) Aufruf wird aufrufen

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

, die etwas langsamer als b.toString() ist seit JVM muss zuerst unboxBoolean zu boolean, die Boolean.toString(...) als Argument übergeben wird, während b.toString()private boolean value Feld wieder verwendet in Boolean Objekt, das seinen Zustand hält.

+0

Letzter Satz ist unklar – rmtheis

+0

@rmtheis Ich aktualisierte es ein wenig. Wie ist es jetzt? – Pshemo

+0

Das ist klar. Vielen Dank! – rmtheis

3
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 
-------------- 
+0

Versuchen Sie, Ihren Code korrekt zu formatieren und einige Erklärungen zu geben. – helloflash

1

Wenn Sie einen schnellen Weg freuen, dies zu tun, zum Beispiel das Debuggen, können Sie einfach einen leeren String verketten auf den boolean:

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

Ich empfehle jedoch dringend, eine andere Methode für die Produktionsnutzung zu verwenden. Dies ist eine einfache schnelle Lösung, die für das Debuggen nützlich ist.

+0

Können Sie bitte erläutern, warum Sie die Verwendung für die Produktion nicht empfehlen? Kann es in einem Szenario scheitern? – lazyvab

+0

@lazyvab In aller Ehrlichkeit habe ich keine Ahnung! Ich schreibe Java nicht mehr, aber ich kann nur vermuten, dass es etwas war, das ich gehört haben muss. Ich habe in den letzten Jahren in anderen Sprachen programmiert, kann aber nicht verstehen, warum die Verwendung in der Produktion schaden würde. Außerdem ist 'System.out.println' sowieso zum Debuggen, oder? – jskidd3

3

Wenn dies zum Zweck ist eine Konstante „wahren“ Wert des Erhaltens, sondern als „True“ oder „TRUE“, können Sie diese verwenden:

Boolean.TRUE.toString(); 
Boolean.FALSE.toString(); 
1

Hängt davon ab, was Sie unter „effizient“ . Leistungsmäßig sind beide Versionen identisch mit dem gleichen Bytecode.

$ ./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