在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 Boolean
到 boolean
,这将作为参数传递给 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
引用,如果您的引用是 null
,Boolean.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中将布尔对象转换为字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章