【问题标题】:Best approach to converting Boolean object to string in java在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)

标签: java boolean


【解决方案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
          

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

          【讨论】:

            猜你喜欢
            • 2020-06-02
            • 1970-01-01
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            • 2014-03-01
            • 2021-08-03
            • 2010-12-05
            • 1970-01-01
            相关资源
            最近更新 更多