Najlepsze podejście do konwersji obiektu Boolean na string w java


108

Próbuję przekonwertować wartość logiczną na ciąg znaków ...

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

lub

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

który z powyższych byłby bardziej wydajny?


Czy spojrzałeś na kod źródłowy tych dwóch metod?
WYJŚCIE - Anony-Mousse

1
Wolę ""+b. Jest wolniejszy, ale bardziej wydajny dla programisty. Jeśli chcesz uzyskać najwyższą wydajność, możesz zapisać dane do / z bezpośredniego ByteBuffera, tj. Zmienić to, co robisz z Stringiem, aby nie było to potrzebne.
Peter Lawrey,

Ponadto, jeśli chcesz traktować nulljak false, możesz użyćString.format("%b", b)
ZhekaKozlov

Odpowiedzi:


145

Nie sądzę, żeby była między nimi jakaś znacząca różnica w wydajności, ale wolałbym pierwszy sposób.

Jeśli masz Booleanodniesienie, Boolean.toString(boolean)wyrzuci, NullPointerExceptionjeśli masz odniesienie null. Ponieważ odwołanie jest rozpakowane booleanprzed przekazaniem do metody.

Podczas gdy String.valueOf()metoda, jak pokazuje kod źródłowy, robi jawne nullsprawdzenie:

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

Po prostu przetestuj ten kod:

Boolean b = null;

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

W przypadku prymitywnych wartości logicznych nie ma różnicy.


1
1 dla fragmentów testowych!
gaurav

28

Jeśli jesteś pewien, że nie nullmasz wartości , możesz skorzystać z trzeciej opcji, którą jest

String str3 = b.toString();

a jego kod wygląda tak

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

Jeśli chcesz mieć bezpieczny null, użyj String.valueOf(b)kodu, który wygląda jak

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

więc jak widzisz, najpierw przetestuje, nulla później wywoła toString()metodę na twoim obiekcie.


Wołanie Boolean.toString(b)wywoła

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

co jest trochę wolniejsze niż b.toString()od czasu, gdy JVM musi najpierw rozpakować, Boolean do booleanktórego zostanie przekazany jako argument Boolean.toString(...), podczas gdy b.toString()ponownie wykorzystuje private boolean valuepole w Booleanobiekcie, który utrzymuje jego stan.


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

Spróbuj poprawnie sformatować swój kod i podać kilka wyjaśnień.
helloflash

3

Jeśli ma to na celu uzyskanie stałej wartości „true” zamiast „True” lub „TRUE”, możesz użyć tego:

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

1

Jeśli szukasz szybkiego sposobu, aby to zrobić, na przykład debugowania, możesz po prostu połączyć pusty ciąg z wartością logiczną:

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

Jednak zdecydowanie zalecam użycie innej metody do użytku produkcyjnego. Jest to proste i szybkie rozwiązanie przydatne do debugowania.


Czy możesz wyjaśnić, dlaczego nie zalecamy używania do użytku produkcyjnego? Czy może zawieść w jakimś scenariuszu?
lazyvab

@lazyvab Szczerze mówiąc, nie mam pojęcia! Nie piszę już Javy, ale mogę tylko przypuszczać, że to było coś, co musiałem usłyszeć. Od kilku lat programuję w innych językach, ale nie rozumiem, dlaczego używanie tego w produkcji miałoby zaszkodzić. Poza tym i tak System.out.printlnsłuży do debugowania, prawda?
jskidd3

1

Zależy od tego, co masz na myśli, mówiąc „wydajnie”. Pod względem wydajności obie wersje mają ten sam kod bajtowy.

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

Jeśli widzisz implementację obu metod, wyglądają tak samo.

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

Zatem obie metody są równie skuteczne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.