Phương pháp tốt nhất để chuyển đổi đối tượng Boolean thành chuỗi trong java


108

Tôi đang cố chuyển đổi boolean thành kiểu chuỗi ...

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

hoặc là

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

cái nào ở trên sẽ hiệu quả hơn?


Bạn đã xem mã nguồn của hai phương pháp này chưa?
Có QUIT - Anony-Mousse,

1
Tôi thích hơn ""+b. Nó chậm hơn nhưng hiệu quả hơn cho nhà phát triển. Nếu bạn muốn có hiệu suất cao nhất, bạn có thể ghi dữ liệu vào / từ mộ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ó.
Peter Lawrey

Ngoài ra, nếu bạn muốn để điều trị nullnhư false, bạn có thể sử dụngString.format("%b", b)
ZhekaKozlov

Câu trả lời:


145

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

Nếu bạn có một Booleantài liệu tham khảo, Boolean.toString(boolean)sẽ ném NullPointerExceptionnếu tài liệu tham khảo của bạn là null. Vì tham chiếu được mở hộp đếnboolean trước khi được chuyển đến phương thức.

Trong khi, String.valueOf()phương thức như mã nguồn hiển thị, có nullkiểm tra rõ ràng không :

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 với boolean nguyên thủy, không có sự khác biệt.


1
1 cho các đoạn mã thử nghiệm!
gaurav

28

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

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 không an toàn, hãy sử dụng String.valueOf(b)mã nào trông giống như

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

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


Gọi điện Boolean.toString(b)sẽ gọi

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

đó là chút chậm hơn so với b.toString()từ JVM cần phải đầu tiên Unbox Boolean đến booleanđó sẽ được thông qua như là đối số để Boolean.toString(...), trong khi b.toString()lần sử dụng private boolean valuetrường trong Booleanđối tượng nắm giữ trạng thái của nó.


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

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

3

Nếu điều này nhằm mục đích nhận giá trị "true" không đổi, thay vì "True" hoặc "TRUE", bạn có thể sử dụng:

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

1

Nếu bạn đang tìm kiếm một cách nhanh chóng để thực hiện việc này, chẳng hạn như gỡ lỗi, bạn có thể chỉ cần nối một chuỗi rỗng vào boolean:

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

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


Bạn có thể vui lòng giải thích lý do tại sao bạn không khuyên bạn nên sử dụng cho việc sử dụng sản xuất? Nó có thể thất bại trong một số tình huống?
lazyvab

@lazyvab Thành thật mà nói, tôi không biết! Tôi không viết Java nữa nhưng tôi chỉ có thể cho rằng đó là điều mà tôi phải nghe. Tôi đã lập trình bằng các ngôn ngữ khác trong vài năm qua nhưng không hiểu tại sao việc sử dụng ngôn ngữ này trong sản xuất lại có hại. Bên cạnh đó System.out.printlnlà để gỡ lỗi anyway, phải không?
jskidd3

1

Phụ thuộc vào những gì bạn có nghĩa là "hiệu quả". Hiệu suất khôn ngoan cả hai phiên bản đều giống nhau vì cùng một mã byte.

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

Nếu bạn thấy việc triển khai cả hai phương pháp, chúng trông giống nhau.

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

Vì vậy, cả hai phương pháp đều hiệu quả như nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.