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

108

Я пытаюсь преобразовать логическое значение в строковый ...

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

или

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

какой из вышеперечисленных будет более эффективным?

Рэйчел
источник
Вы смотрели исходный код этих двух методов?
ВЫЙТИ - Anony-Mousse
1
Я предпочитаю ""+b. Это медленнее, но более эффективно для разработчика. Если вам нужна максимальная производительность, вы можете записывать данные в / из прямого ByteBuffer, то есть изменить то, что вы делаете со строкой, чтобы она вам не понадобилась.
Питер Лоури
Также, если вы хотите лечить nullкак false, можете использоватьString.format("%b", b)
ЖекаКозлов

Ответы:

145

Я не думаю, что между ними будет какая-то значительная разница в производительности, но я бы предпочел первый способ.

Если у вас есть 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()повторно использует 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 04
3

Если это делается с целью получения постоянного «истинного» значения, а не «Истина» или «ИСТИНА», вы можете использовать это:

Boolean.TRUE.toString();
Boolean.FALSE.toString();
Шашанк
источник
1

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

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

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

jskidd3
источник
Не могли бы вы пояснить, почему вы не рекомендуете использовать его в производственной среде? Может ли это выйти из строя в каком-то сценарии?
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";
    }

Так что оба метода одинаково эффективны.

Singh30
источник