Найкращий підхід до перетворення булевого об'єкта в рядок в Java


108

Я намагаюся перетворити булевий в рядковий тип ...

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

або

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

який із перерахованих вище був би більш ефективним?


Ви подивилися вихідний код цих двох методів?
Має QUIT - Anonymous-Mousse

1
Я віддаю перевагу ""+b. Це повільніше, але ефективніше для розробника. Якщо ви хочете досягти максимальної продуктивності, ви можете записувати дані в / з прямого ByteBuffer, тобто змінювати те, що ви робите з String, щоб вони вам не потрібні.
Пітер Лорі

Також, якщо ви хочете ставитися nullяк false, ви можете скористатисяString.format("%b", b)
ЖекаКозлов

Відповіді:


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 потрібно спочатку розблокувати, Boolean до booleanякого буде передано аргумент Boolean.toString(...), при цьому b.toString()повторно використовує 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

Якщо це призначено для отримання постійного "справжнього" значення, а не "Істинного" або "ІСТИННОГО", ви можете використовувати це:

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

1

Якщо ви шукаєте швидкий спосіб зробити це, наприклад, налагодження, ви можете просто об'єднати порожній рядок з булевим:

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

Однак настійно рекомендую використовувати інший метод для використання у виробництві. Це просте швидке рішення, яке корисно для налагодження.


Розкажіть, будь ласка, чому ви не рекомендуєте використовувати їх для виробництва? Чи може це провалитися в якомусь сценарії?
lazyvab

@lazyvab Чесно кажучи, я поняття не маю! Я більше не пишу Java, але можу лише припустити, що це я повинен був почути. Я програмував іншими мовами останні кілька років, але не можу зрозуміти, чому використання цього у виробництві зашкодить. Крім того System.out.println, для налагодження все одно, правда?
jskidd3

1

Залежить від того, що ви маєте на увазі під "ефективним". Обидві версії обох версій такі ж, як і той самий байт-код.

$ ./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 (b)

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

Тож обидва методи однаково ефективні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.