Bester Ansatz zum Konvertieren von Booleschen Objekten in Zeichenfolgen in Java


108

Ich versuche, Boolesche in String-Typ zu konvertieren ...

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

oder

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

Welches der oben genannten wäre effizienter?


Haben Sie sich den Quellcode dieser beiden Methoden angesehen?
Hat aufgehört - Anony-Mousse

1
Ich bevorzuge ""+b. Es ist langsamer, aber effizienter für den Entwickler. Wenn Sie Spitzenleistung wünschen, können Sie die Daten in einen direkten ByteBuffer schreiben, dh ändern, was Sie mit dem String tun, damit Sie ihn nicht benötigen.
Peter Lawrey

Auch, wenn Sie behandeln wollen , nullwie falsekönnen Sie verwendenString.format("%b", b)
ZhekaKozlov

Antworten:


145

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

Wenn Sie eine BooleanReferenz haben, Boolean.toString(boolean)wird geworfen, NullPointerExceptionwenn Ihre Referenz ist null. Da die Referenz entpackt ist, booleanbevor sie an die Methode übergeben wird.

Während die String.valueOf()Methode, wie der Quellcode zeigt, die explizite nullPrüfung durchführt:

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

Testen Sie einfach diesen Code:

Boolean b = null;

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

Für primitive Boolesche Werte gibt es keinen Unterschied.


1
1 für die Testschnipsel!
Gaurav

28

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

String str3 = b.toString();

und sein Code sieht aus wie

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

Wenn Sie null-sicher sein möchten, verwenden Sie, String.valueOf(b)welcher Code aussieht

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

Wie Sie sehen, wird zuerst nulldie toString()Methode für Ihr Objekt getestet und später aufgerufen .


Der Anruf Boolean.toString(b)wird aufgerufen

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

Das ist etwas langsamer als b.toString()da JVM muss zuerst unbox Boolean zu booleandem als Argument übergeben wird , um Boolean.toString(...), während b.toString()Umnutzungen private boolean valueFeld in BooleanObjekt , das seinen Zustand hält.


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
--------------

Versuchen Sie, Ihren Code korrekt zu formatieren und einige Erklärungen abzugeben.
Helloflash

3

Wenn dies dazu dient, einen konstanten "wahren" Wert anstelle von "wahr" oder "WAHR" zu erhalten, können Sie Folgendes verwenden:

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

1

Wenn Sie nach einer schnellen Möglichkeit suchen, dies zu tun, beispielsweise das Debuggen, können Sie einfach eine leere Zeichenfolge mit dem Booleschen Wert verknüpfen:

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

Ich empfehle jedoch dringend, eine andere Methode für die Verwendung in der Produktion zu verwenden. Dies ist eine einfache schnelle Lösung, die zum Debuggen nützlich ist.


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

@lazyvab Ehrlich gesagt habe ich keine Ahnung! Ich schreibe kein Java mehr, aber ich kann nur vermuten, dass es etwas war, was 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 System.out.printlnist sowieso für das Debuggen, oder?
Jskidd3

1

Kommt darauf an, was du mit "effizient" meinst. In Bezug auf die Leistung 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

0

Wenn Sie die Implementierung beider Methoden sehen, sehen sie gleich aus.

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";
    }

Beide Methoden sind also gleich effizient.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.