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


108

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

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

要么

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

以上哪一项效率更高?


您是否看过这两种方法的源代码
已退出-Anony-Mousse 2013年

1
我更喜欢""+b。对于开发人员而言,它速度较慢,但​​效率更高。如果您想获得最佳性能,则可以将数据写入直接ByteBuffer或从直接ByteBuffer写入数据,即更改对String的操作,从而不需要它。
彼得·劳瑞

此外,如果您想将其null视为false,则可以使用String.format("%b", b)
ZhekaKozlov

Answers:


145

我认为它们之间不会有明显的性能差异,但是我更喜欢第一种方法。

如果您有Boolean参考,则为Boolean.toString(boolean)时抛出。由于引用在传递给方法之前已取消装箱。NullPointerExceptionnullboolean

同时,String.valueOf()如源代码所示,method进行显式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";
}

如果您想使用null安全,请使用以下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需要首先拆箱 Booleanboolean其将作为参数传递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 2015年

3

如果这是为了获取恒定的“ true”值而不是“ True”或“ TRUE”,则可以使用以下命令:

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

1

如果您正在寻找一种快速的方法(例如调试),则可以将一个空字符串连接到布尔值上:

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

但是,我强烈建议您使用其他方法进行生产。这是一个简单的快速解决方案,对调试很有用。


您能否详细说明为什么不建议将其用于生产用途?它在某些情况下会失败吗?
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";
    }

因此,这两种方法都同样有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.