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

Posted

技术标签:

【中文标题】在java中将布尔对象转换为字符串的最佳方法【英文标题】:Best approach to converting Boolean object to string in java 【发布时间】:2013-09-20 21:36:23 【问题描述】:

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

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

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

以上哪一项会更有效?

【问题讨论】:

你看过这两种方法的源码了吗? 我更喜欢""+b。它对开发人员来说速度较慢但效率更高。如果您想获得最佳性能,您可以将数据写入直接 ByteBuffer 或从直接 ByteBuffer 写入数据,即更改您对 String 所做的操作,这样您就不需要它了。 另外,如果你想把null当作false,你可以使用String.format("%b", b) 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

取决于您所说的“高效”。在性能方面,两个版本都与相同的字节码相同。

$ ./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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:
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
--------------

【讨论】:

尝试正确格式化你的代码,并给出一些解释。【参考方案6】:

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

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

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

【讨论】:

您能否详细说明为什么不建议将其用于生产用途?在某些情况下会失败吗? @lazyvab 老实说我不知道​​!我不再编写 Java,但我只能推测这是我一定听说过的东西。过去几年我一直在用其他语言编程,但不明白为什么在生产中使用它会受到伤害。况且System.out.println 还是用来调试的吧?【参考方案7】:

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

如果您有 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

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

【讨论】:

以上是关于在java中将布尔对象转换为字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将二维布尔数组转换为一维字节数组?

java将json字符串转换成对象批量存储数据

将json字符串转换为对象数组的最佳方法是啥? [复制]

在perl中将日期转换为纪元的最佳方法[关闭]

在Jackson中将Java对象转换为JsonNode [重复]

在 Java ME 中将 JSON 字符串转换为对象?