แนวทางที่ดีที่สุดในการแปลงวัตถุบูลีนเป็นสตริงใน java


108

ฉันกำลังพยายามแปลงบูลีนเป็นประเภทสตริง ...

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

หรือ

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

ข้อใดจะมีประสิทธิภาพมากกว่ากัน


คุณได้ดูซอร์สโค้ดของสองวิธีนี้แล้วหรือยัง?
มี QUIT - Anony-Mousse

1
""+bฉันชอบ ช้ากว่า แต่มีประสิทธิภาพมากขึ้นสำหรับนักพัฒนา หากคุณต้องการประสิทธิภาพสูงสุดคุณสามารถเขียนข้อมูลไปยัง / จาก ByteBuffer โดยตรงเช่นเปลี่ยนสิ่งที่คุณทำกับ String เพื่อที่คุณจะได้ไม่ต้องการ
Peter Lawrey

นอกจากนี้หากคุณต้องการรักษาnullเป็นfalseคุณสามารถใช้String.format("%b", b)
ZhekaKozlov

คำตอบ:


145

ฉันไม่คิดว่าจะมีความแตกต่างด้านประสิทธิภาพอย่างมีนัยสำคัญระหว่างพวกเขา แต่ฉันต้องการวิธีที่ 1 มากกว่า

หากคุณมีBooleanการอ้างอิงBoolean.toString(boolean)จะโยนถ้าการอ้างอิงของคุณคือNullPointerException nullเนื่องจากการอ้างอิงถูกยกเลิกการใส่กล่องbooleanก่อนที่จะส่งไปยังเมธอด

ในขณะที่String.valueOf()วิธีการตามที่แสดงซอร์สโค้ดจะnullตรวจสอบอย่างชัดเจน:

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

เพียงทดสอบรหัสนี้:

Boolean b = null;

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

สำหรับบูลีนดั้งเดิมไม่มีความแตกต่าง


1
1 สำหรับตัวอย่างการทดสอบ!
Gaurav

28

หากคุณแน่ใจว่าค่าของคุณไม่ใช่nullคุณสามารถใช้ตัวเลือกที่สามซึ่งก็คือ

String str3 = b.toString();

และรหัสของมันดูเหมือน

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

หากคุณต้องการเป็นโมฆะให้ใช้String.valueOf(b)รหัสที่ดูเหมือน

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

ดังที่คุณเห็นจะทดสอบก่อนnullและเรียกใช้toString()วิธีการในวัตถุของคุณในภายหลัง


การโทรBoolean.toString(b)จะเรียกใช้

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

ซึ่งจะช้ากว่าเล็กน้อยb.toString()ตั้งแต่ JVM ความต้องการที่จะเป็นครั้งแรกUnbox Booleanไปbooleanซึ่งจะถูกส่งผ่านเป็นอาร์กิวเมนต์Boolean.toString(...)ขณะb.toString()reuses private boolean valueฟิลด์ในBooleanวัตถุซึ่งถือของรัฐ


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

พยายามจัดรูปแบบโค้ดของคุณให้ถูกต้องและให้คำอธิบาย
helloflash

3

หากนี่คือจุดประสงค์เพื่อให้ได้ค่าคงที่ "จริง" แทนที่จะเป็น "จริง" หรือ "TRUE" คุณสามารถใช้สิ่งนี้:

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

1

หากคุณกำลังมองหาวิธีที่รวดเร็วในการดำเนินการนี้ตัวอย่างเช่นการดีบักคุณสามารถเชื่อมสตริงว่างเข้ากับบูลีน:

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

อย่างไรก็ตามฉันขอแนะนำอย่างยิ่งให้ใช้วิธีอื่นสำหรับการใช้งานจริง นี่เป็นวิธีแก้ปัญหาง่ายๆอย่างรวดเร็วซึ่งมีประโยชน์สำหรับการดีบัก


คุณช่วยอธิบายให้ละเอียดได้ไหมว่าทำไมคุณไม่แนะนำให้ใช้สำหรับการผลิต สามารถล้มเหลวในบางสถานการณ์ได้หรือไม่?
lazyvab

@lazyvab ด้วยความสัตย์จริงฉันไม่รู้! ฉันไม่ได้เขียน Java อีกต่อไป แต่ฉันสามารถสันนิษฐานได้ว่าเป็นสิ่งที่ฉันต้องเคยได้ยิน ฉันเขียนโปรแกรมในภาษาอื่น ๆ มาหลายปีแล้ว แต่ไม่เห็นว่าทำไมการใช้สิ่งนี้ในการผลิตถึงจะเจ็บ นอกจากนี้ยังSystem.out.printlnมีไว้สำหรับการแก้ไขข้อบกพร่องใช่ไหม?
jskidd3

1

ขึ้นอยู่กับความหมายของ "ประสิทธิภาพ" ประสิทธิภาพที่ชาญฉลาดทั้งสองเวอร์ชันเหมือนกับรหัส bytecode เดียวกัน

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

หากคุณเห็นการใช้งานทั้งสองวิธีแสดงว่ามีลักษณะเหมือนกัน

String.valueOf (b)

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

Boolean.toString (ข)

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

ดังนั้นทั้งสองวิธีจึงมีประสิทธิภาพเท่าเทียมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.