web-dev-qa-db-ja.com

JavaでBooleanオブジェクトを文字列に変換するための最良の方法

ブール値を文字列型に変換しようとしています...

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

または

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

上記のどれがより効率的でしょうか?

99
Rachel

それらの間にパフォーマンス上の大きな違いがあるとは思わないが、私は最初の方法を好むだろう。

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

プリミティブブール値の場合、違いはありません。

140
Rohit Jain

値が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 booleanBoolean.toString(...)に引数として渡されますが、b.toString()は、その状態を保持するBooleanオブジェクトのprivate boolean valueフィールドを再利用します。

27
Pshemo

これが "True"や "TRUE"ではなく、定数の "true"値を取得することを目的としている場合、これを使用できます。

Boolean.TRUE.toString();
Boolean.FALSE.toString();
3
Shashank
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
--------------
3
user4417223

これを行うための簡単な方法、例えばデバッグを探しているのなら、単に空の文字列をブール値に連結することができます。

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

ただし、プロダクション用に別の方法を使用することを強くお勧めします。これはデバッグに役立つ簡単で素早い解決策です。

1
jskidd3

あなたが「効率的」と言う意味によります。性能的には両方のバージョンとも同じバイトコードと同じです。

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

両方の方法の実装を見れば、それらは同じに見えます。

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

したがって、どちらの方法も同等に効率的です。

0
singh30