ブール値を文字列型に変換しようとしています...
Boolean b = true;
String str = String.valueOf(b);
または
Boolean b = true;
String str = Boolean.toString(b);
上記のどれがより効率的でしょうか?
それらの間にパフォーマンス上の大きな違いがあるとは思わないが、私は最初の方法を好むだろう。
Boolean
参照がある場合、参照がNullPointerException
であればBoolean.toString(boolean)
はnull
をスローします。参照はメソッドに渡される前に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
プリミティブブール値の場合、違いはありません。
値がnull
ではないことが確実な場合は、3番目のオプションを使用できます
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";
}
jVMが最初に必要なのはb.toString()
より少し遅いですnboxBoolean
to boolean
はBoolean.toString(...)
に引数として渡されますが、b.toString()
は、その状態を保持するBoolean
オブジェクトのprivate boolean value
フィールドを再利用します。
これが "True"や "TRUE"ではなく、定数の "true"値を取得することを目的としている場合、これを使用できます。
Boolean.TRUE.toString();
Boolean.FALSE.toString();
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 --------------
これを行うための簡単な方法、例えばデバッグを探しているのなら、単に空の文字列をブール値に連結することができます。
System.out.println(b+"");
ただし、プロダクション用に別の方法を使用することを強くお勧めします。これはデバッグに役立つ簡単で素早い解決策です。
あなたが「効率的」と言う意味によります。性能的には両方のバージョンとも同じバイトコードと同じです。
$ ./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)
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
Boolean.toString(b)
public static String toString(boolean b) {
return b ? "true" : "false";
}
したがって、どちらの方法も同等に効率的です。