Pendekatan terbaik untuk mengonversi objek Boolean menjadi string di java

108

Saya mencoba mengubah boolean menjadi tipe string ...

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

atau

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

manakah di atas yang lebih efisien?

Rachel
sumber
Pernahkah Anda melihat kode sumber dari kedua metode ini?
Memiliki QUIT - Anony-Mousse
1
Saya lebih suka ""+b. Ini lebih lambat tetapi lebih efisien untuk pengembang. Jika Anda menginginkan kinerja terbaik, Anda dapat menulis data ke / dari ByteBuffer langsung, yaitu mengubah apa yang Anda lakukan dengan String sehingga Anda tidak membutuhkannya.
Peter Lawrey
Juga, jika Anda ingin diperlakukan nullsebagai false, Anda dapat menggunakanString.format("%b", b)
ZhekaKozlov

Jawaban:

145

Saya tidak berpikir akan ada perbedaan kinerja yang signifikan di antara mereka, tetapi saya lebih suka cara pertama.

Jika Anda memiliki Booleanreferensi, Boolean.toString(boolean)akan membuang NullPointerExceptionjika referensi Anda null. Saat referensi dibuka kotaknyaboolean dimasukkan sebelum diteruskan ke metode.

Sementara, String.valueOf()metode seperti yang ditunjukkan oleh kode sumber, melakukan nullpemeriksaan eksplisit :

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

Uji saja kode ini:

Boolean b = null;

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

Untuk boolean primitif, tidak ada perbedaan.

Rohit Jain
sumber
1
1 untuk cuplikan pengujian!
gaurav
28

Jika Anda yakin bahwa nilainya tidak, nullAnda dapat menggunakan opsi ketiga yaitu

String str3 = b.toString();

dan kodenya terlihat seperti

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

Jika Anda ingin aman dari nol, gunakan String.valueOf(b)kode seperti apa

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

jadi seperti yang Anda lihat, ini akan menguji terlebih dahulu nulldan kemudian memanggil toString()metode pada objek Anda.


Menelepon Boolean.toString(b)akan dipanggil

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

yang sedikit lebih lambat dari b.toString()sejak JVM perlu pertama unbox Boolean untuk booleanyang akan lulus sebagai argumen untuk Boolean.toString(...)sementara b.toString()digunakan ulang private boolean valuelapangan di Booleanobjek yang memegang negaranya.

Pshemo
sumber
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
--------------
janisz
sumber
Cobalah untuk memformat kode Anda dengan benar, dan berikan beberapa penjelasan.
helloflash
3

Jika ini bertujuan untuk mendapatkan nilai "benar" yang konstan, daripada "Benar" atau "BENAR", Anda dapat menggunakan ini:

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

Jika Anda mencari cara cepat untuk melakukan ini, misalnya debugging, Anda cukup menggabungkan string kosong ke boolean:

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

Namun, saya sangat menyarankan menggunakan metode lain untuk penggunaan produksi. Ini adalah solusi cepat sederhana yang berguna untuk debugging.

jskidd3
sumber
Bisakah Anda menjelaskan mengapa Anda tidak merekomendasikan penggunaan untuk penggunaan produksi? Bisakah itu gagal dalam beberapa skenario?
lazyvab
@lazyvab Sejujurnya saya tidak tahu! Saya tidak menulis Java lagi tetapi saya hanya bisa menduga bahwa itu adalah sesuatu yang pasti pernah saya dengar. Saya telah memprogram dalam bahasa lain selama beberapa tahun terakhir tetapi tidak mengerti mengapa menggunakan ini dalam produksi akan merugikan. Lagipula System.out.printlnuntuk debugging sih, kan?
jskidd3
1

Tergantung apa yang Anda maksud dengan "efisien". Dari segi performa, kedua versi sama dengan bytecode yang sama.

$ ./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
kmera
sumber
0

Jika Anda melihat penerapan kedua metode tersebut, keduanya terlihat sama.

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

Jadi kedua metode tersebut sama-sama efisien.

singh30
sumber