Java'da Boole nesnesini dizeye dönüştürmek için en iyi yaklaşım


108

Boolean'ı dize türüne dönüştürmeye çalışıyorum ...

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

veya

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

Yukarıdakilerden hangisi daha verimli olur?


Bu iki yöntemin kaynak koduna baktınız mı ?
ÇIKTI - Anony-Mousse

1
Tercih ederim ""+b. Geliştirici için daha yavaş ama daha verimli. En yüksek performansı istiyorsanız, verileri doğrudan bir ByteBuffer'a / buradan yazabilirsiniz, yani String ile yaptığınız şeyi değiştirerek ihtiyacınız kalmaz.
Peter Lawrey

Eğer tedavi etmek istiyorum Ayrıca, nullolarak false, kullanabilirsinizString.format("%b", b)
ZhekaKozlov

Yanıtlar:


145

Aralarında önemli bir performans farkı olacağını sanmıyorum ama 1. yolu tercih ederim.

Eğer bir varsa Booleanreferansı, Boolean.toString(boolean)atacağım NullPointerExceptionreferans ise null. booleanYönteme aktarılmadan önce referans kutudan çıkarıldığı için .

İken, String.valueOf()kaynak kodun gösterdiği gibi metod, açık yapar nullçek:

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

Sadece bu kodu test edin:

Boolean b = null;

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

İlkel boole için fark yoktur.


1
Test parçacıkları için 1!
Gaurav

28

Değerinizin olmadığından nulleminseniz üçüncü seçeneği kullanabilirsiniz.

String str3 = b.toString();

ve kodu gibi görünüyor

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

Boş güvenlikli olmak istiyorsanız, String.valueOf(b)hangi kodun benzediğini kullanın

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

Gördüğünüz gibi, önce nesnenizi test edecek nullve daha sonra toString()yöntemi çağıracaktır .


Çağrı Boolean.toString(b)çağırır

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

az olan daha yavaş olan b.toString()JVM ilk gerekir çünkü Unbox Boolean için booleanbağımsız değişken olarak kabul edilecek olan Boolean.toString(...)ise, b.toString()Yeniden kullanılmamış private boolean valuealan Booleannesnenin durumunu tutan.


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

Kodunuzu doğru bir şekilde biçimlendirmeye ve bazı açıklamalar yapmaya çalışın.
helloflash

3

Bu, "Doğru" veya "DOĞRU" yerine sabit bir "gerçek" değer elde etmek amacındaysa, şunu kullanabilirsiniz:

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

1

Bunu yapmanın hızlı bir yolunu arıyorsanız, örneğin hata ayıklama, boolean üzerine boş bir dizeyi birleştirebilirsiniz:

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

Ancak, üretim kullanımı için başka bir yöntem kullanmanızı şiddetle tavsiye ederim. Bu, hata ayıklama için yararlı olan basit ve hızlı bir çözümdür.


Üretim kullanımı için kullanmayı neden önermediğinizi açıklar mısınız? Bazı senaryolarda başarısız olabilir mi?
lazyvab

@lazyvab Dürüst olmak gerekirse hiçbir fikrim yok! Artık Java yazmıyorum ama sadece duymuş olmam gereken bir şey olduğunu tahmin edebilirim. Son birkaç yıldır başka dillerde programlama yapıyorum, ancak bunu üretimde kullanmanın neden zarar vereceğini anlayamıyorum. Ayrıca System.out.printlnzaten hata ayıklamak için değil mi?
jskidd3

1

"Etkili" ile ne demek istediğine bağlı. Performans açısından her iki sürüm de aynı bayt koduyla aynıdır.

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

Her iki yöntemin uygulanmasını görürseniz, ikisi de aynı görünür.

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

Yani her iki yöntem de eşit derecede etkilidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.