2013-09-16 12 views
80

próbuję przekonwertować wartość logiczną do typu string ...najlepszym podejściem do konwertowania Boolean ciąg w java

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

lub

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

którym jeden z wyżej byłby bardziej efektywny?

+0

Czy obejrzałeś * kod źródłowy * tych dwóch metod? –

+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 za pomocą String, więc nie potrzebujesz tego. –

Odpowiedz

113

Nie sądzę, że wystąpiłaby znacząca różnica w wydajności między nimi, ale wolałbym pierwszą drogę.

Jeśli masz Boolean odniesienia, Boolean.toString(boolean) rzuci NullPointerException jeśli odniesienia jest null. Ponieważ odniesienie jest rozpakowane do boolean przed przekazaniem do metody.

Chociaż String.valueOf() sposób jak kod pokazuje źródłowych, czy wyraźnej null sprawdzenia:

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

prostu przetestować ten kod:

Boolean b = null; 

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

prymitywnych logiczną, nie ma różnicy .

20

Jeżeli jesteś pewien, że wartość nie jest null można użyć trzeciej opcji, która jest

String str3 = b.toString(); 

a jego kod wygląda

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

Jeśli chcesz być null- bezpieczne używanie String.valueOf(b) który kod wygląda jak

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

, tak jak widać, najpierw przetestuje pod kątem null, a następnie wywoła metodę toString() na obiekcie.


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

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

który jest trochę wolniej niż b.toString() ponieważ JVM musi najpierw unboxBoolean do boolean który zostanie przekazany jako argument do Boolean.toString(...), natomiast b.toString() ponownie wykorzystuje private boolean value pola w Boolean obiekt, który utrzymuje swój stan.

+0

Ostatnie zdanie jest niejasne – rmtheis

+0

@rmtheis Zaktualizowałem trochę. Jak jest teraz? – Pshemo

+0

To jasne. Dziękuję Ci! – 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

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

1

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

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

Jednak zdecydowanie zalecam użycie innej metody użycia produkcji. Jest to proste, szybkie rozwiązanie, które jest przydatne do debugowania.

+0

Proszę wyjaśnić, dlaczego nie zaleca się używania do celów produkcyjnych? Czy może się nie powieść w niektórych scenariuszach? – lazyvab

+0

@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ć. W ciągu ostatnich kilku lat programowałem w innych językach, ale nie widzę powodu, dla którego używanie tego przy produkcji byłoby szkodliwe. Poza tym 'System.out.println' jest na razie do debugowania, prawda? – jskidd3

3

Jeśli jest to w celu uzyskania stałej „prawdziwej” wartości, raczej niż „prawda” lub „true”, można użyć to:

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

Zależy co masz na myśli przez „efektywny” . Pod względem wydajności obie wersje są takie same jak 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