Я пытаюсь преобразовать boolean в строковый тип...
Boolean b = true;
String str = String.valueOf(b);
или
Boolean b = true;
String str = Boolean.toString(b);
который был бы более эффективным?
Я пытаюсь преобразовать boolean в строковый тип...
Boolean b = true;
String str = String.valueOf(b);
или
Boolean b = true;
String str = Boolean.toString(b);
который был бы более эффективным?
Я не думаю, что между ними была бы существенная разница в производительности, но я предпочел бы первый вариант.
Если у вас есть ссылка 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
Для примитивного булева нет разницы.
Если вы уверены, что ваше значение не равно 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
, который имеет свое состояние.
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 --------------
Если это предназначено для получения постоянного "истинного" значения, а не "истинного" или "истинного" , вы можете использовать это:
Boolean.TRUE.toString();
Boolean.FALSE.toString();
Зависит от того, что вы подразумеваете под "эффективным". Производительность обеих версий совпадает с тем же байт-кодом.
$ ./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
Если вы ищете быстрый способ сделать это, например, отладки, вы можете просто конкатенировать пустую строку на логическое:
System.out.println(b+"");
Однако я настоятельно рекомендую использовать другой метод для использования в производстве. Это простое быстрое решение, которое полезно для отладки.