2013-09-16 53 views
80

Tôi cố gắng để chuyển đổi boolean để loại chuỗi ...cách tiếp cận tốt nhất để chuyển đổi đối tượng Boolean để chuỗi trong java

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

hoặc

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

mà một trong những trên sẽ hiệu quả hơn?

+0

Bạn đã xem mã nguồn * của hai phương pháp này chưa? –

+1

Tôi thích '" "+ b' hơn. Nó chậm hơn nhưng hiệu quả hơn cho nhà phát triển. Nếu bạn muốn hiệu năng hàng đầu, bạn có thể ghi dữ liệu đến/từ ByteBuffer trực tiếp, tức là thay đổi những gì bạn làm với Chuỗi để bạn không cần nó. –

Trả lời

113

Tôi không nghĩ rằng sẽ có bất kỳ sự khác biệt hiệu suất đáng kể nào giữa chúng, nhưng tôi thích cách thứ nhất.

Nếu bạn có tham chiếu Boolean, Boolean.toString(boolean) sẽ ném NullPointerException nếu tham chiếu của bạn là null. Vì tham chiếu được bỏ hộp thành boolean trước khi được chuyển đến phương thức.

Trong khi, phương pháp String.valueOf() như mã nguồn cho thấy, hiện rõ ràng null kiểm tra:

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

Chỉ cần kiểm tra mã này:

Boolean b = null; 

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

Đối boolean nguyên thủy, không có sự khác biệt .

20

Nếu bạn chắc chắn rằng giá trị của bạn không phải là null bạn có thể sử dụng tùy chọn thứ ba là

String str3 = b.toString(); 

và mã của nó trông giống như

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

Nếu bạn muốn trở thành null- sử dụng an toàn String.valueOf(b) mã nào trông giống như

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

để bạn thấy nó trước tiên sẽ kiểm tra null và sau đó gọi phương thức toString() trên đối tượng của bạn.


Calling Boolean.toString(b) sẽ gọi

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

mà rất ít chậm hơn so với b.toString() từ JVM cần phải đầu tiên UnboxBoolean để boolean đó sẽ được thông qua như là đối số để Boolean.toString(...), trong khi b.toString() reuses private boolean value trường trong Boolean đối tượng chứa trạng thái của nó.

+0

Câu cuối cùng không rõ ràng – rmtheis

+0

@rmtheis Tôi đã cập nhật nó một chút. Làm thế nào là nó bây giờ? – Pshemo

+0

Rõ ràng. Cảm ơn bạn! – 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

Hãy thử định dạng đúng mã của bạn và đưa ra một số giải thích. – helloflash

1

Nếu bạn đang tìm kiếm một cách nhanh chóng để làm điều này, ví dụ như gỡ lỗi, bạn chỉ có thể nối một chuỗi rỗng sang boolean:

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

Tuy nhiên, tôi khuyên bạn nên sử dụng phương pháp khác để sử dụng sản xuất. Đây là một giải pháp nhanh chóng đơn giản, rất hữu ích cho việc gỡ lỗi.

+0

Bạn có thể vui lòng giải thích lý do tại sao bạn không khuyên bạn sử dụng để sử dụng sản xuất? Nó có thể thất bại trong một số kịch bản? – lazyvab

+0

@lazyvab Trong tất cả sự trung thực tôi không có ý tưởng! Tôi không viết Java nữa nhưng tôi chỉ có thể cho rằng đó là điều tôi phải nghe. Tôi đã được lập trình trong các ngôn ngữ khác trong vài năm qua nhưng không thể thấy tại sao sử dụng nó trong sản xuất sẽ bị tổn thương. Bên cạnh đó 'System.out.println' là để gỡ lỗi anyway, phải không? – jskidd3

3

Nếu đây là nhằm mục đích nhận được một giá trị "true" liên tục, chứ không phải là "True" hoặc "TRUE", bạn có thể sử dụng này:

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

Phụ thuộc vào những gì bạn có nghĩa là bởi "hiệu quả" . Hiệu suất-khôn ngoan cả hai phiên bản là giống như cùng một bytecode của nó.

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