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

在java中将布尔对象转换为字符串的最佳方法,java,boolean,Java,Boolean,我正在尝试将布尔值转换为字符串类型 Boolean b = true; String str = String.valueOf(b); 或 上面哪一个更有效 如果您确定您的值不是null,您可以使用第三个选项,即 String str3 = b.toString(); 它的代码看起来像 public String toString() { return value ? "true" : "false"; } public static String valueOf(Object o

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

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


上面哪一个更有效

如果您确定您的值不是
null
,您可以使用第三个选项,即

String str3 = b.toString();
它的代码看起来像

public String toString() {
    return value ? "true" : "false";
}
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

如果希望为空安全,请使用
String.valueOf(b)
哪个代码看起来像

public String toString() {
    return value ? "true" : "false";
}
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()
重用保存其状态的
布尔对象中的
私有布尔值
字段。

我认为它们之间不会有任何显著的性能差异,但我更喜欢第1种方法

如果您有一个
Boolean
引用,
Boolean.toString(Boolean)
将在引用为
null
时抛出
NullPointerException
。因为在传递给方法之前,引用被取消绑定到
布尔值

而,
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);
    } 

}

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

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

但是,我强烈建议在生产中使用另一种方法。这是一个简单快速的解决方案,对调试非常有用。

如果这是为了获得一个恒定的“真”值,而不是“真”或“真”,您可以使用以下方法:

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

如果您看到这两种方法的实现,它们看起来是一样的

String.valueOf(b)

Boolean.toString(b)


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

你看过这两种方法的源代码了吗?我更喜欢
“”+b
。对于开发人员来说,速度较慢但效率更高。如果希望获得最佳性能,可以将数据写入直接字节缓冲区或从直接字节缓冲区写入数据,即更改对字符串的处理方式,使其不需要。此外,如果希望将
null
视为
false
,可以使用
String.format(“%b”,b)
尝试正确格式化代码,并给出一些解释。你能详细说明一下为什么不建议在生产中使用吗?在某些情况下它会失败吗?@lazyvab老实说,我不知道!我不再写Java了,但我只能推测这是我一定听说过的东西。在过去的几年里,我一直在用其他语言编程,但不明白为什么在生产中使用这种语言会带来伤害。另外,
System.out.println
用于调试,对吗?1用于测试代码段!
public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }
public static String toString(boolean b) {
        return b ? "true" : "false";
    }