Лучший подход к преобразованию Boolean объекта в строку в java

Я пытаюсь преобразовать boolean в строковый тип...

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

или

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

который был бы более эффективным?

Ответ 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

Для примитивного булева нет разницы.

Ответ 2

Если вы уверены, что ваше значение не равно 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
--------------

Ответ 4

Если это предназначено для получения постоянного "истинного" значения, а не "истинного" или "истинного" , вы можете использовать это:

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

Ответ 5

Зависит от того, что вы подразумеваете под "эффективным". Производительность обеих версий совпадает с тем же байт-кодом.

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

Ответ 6

Если вы ищете быстрый способ сделать это, например, отладки, вы можете просто конкатенировать пустую строку на логическое:

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

Однако я настоятельно рекомендую использовать другой метод для использования в производстве. Это простое быстрое решение, которое полезно для отладки.