在 Java 中将布尔对象转换为字符串的最佳方法

我正在尝试将布尔值转换为字符串类型..。

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

或者

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

以上哪一个会更有效率?

246930 次浏览

如果你确定你的值不是 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传递给 booleanboolean将作为参数传递给 Boolean.toString(...),而 b.toString()在保持其状态的 Boolean对象中重用 private boolean value字段。

我不认为他们之间会有任何显著的性能差异,但我更喜欢第一种方式。

如果你有一个 Boolean引用,如果你的引用是 nullBoolean.toString(boolean)将抛出 NullPointerException。因为引用在传递给方法之前已经解除了对 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

对于原始布尔型,没有区别。

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

如果您正在寻找一种快速的方法来做到这一点,例如调试,您可以简单地将一个空字符串连接到布尔值:

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

However, I strongly recommend using another method for production usage. This is a simple quick solution which is useful for debugging.

如果这是为了得到一个常量“ TRUE”值,而不是“ TRUE”或“ TRUE”值,那么可以使用以下命令:

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

If you see implementation of both the method, they look same.

ValueOf (b)

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

ToString (b)

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

所以两种方法都是同样有效的。