[java] Java에서 Boolean 객체를 문자열로 변환하는 가장 좋은 방법

부울을 문자열 유형으로 변환하려고합니다 …

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

또는

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

위 중 어느 것이 더 효율적일까요?



답변

나는 그들 사이에 큰 성능 차이가 없을 것이라고 생각하지만 나는 첫 번째 방법을 선호합니다.

당신이있는 경우 Boolean참조를 Boolean.toString(boolean)throw합니다 NullPointerException참고 인 경우 null. boolean메서드에 전달되기 전에 참조가 unboxed됩니다 .

하지만, 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경우 세 번째 옵션을 사용할 수 있습니다.

String str3 = b.toString();

코드는 다음과 같습니다.

public String toString() {
    return value ? "true" : "false";
}

null-safe가 되길 원한다면 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이 먼저 인수로 전달 될 상자를 풀어야 Boolean 하기 때문에 약간 느리지 만 상태를 유지하는 객체의 필드 를 재사용 합니다 .booleanBoolean.toString(...)b.toString()private boolean valueBoolean


답변

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

답변

이것이 “True”또는 “TRUE”가 아닌 상수 “true”값을 얻기위한 목적이라면 다음을 사용할 수 있습니다.

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


답변

예를 들어 디버깅과 같은 빠른 방법을 찾고 있다면 단순히 빈 문자열을 부울에 연결할 수 있습니다.

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

부울 .toString (b)

public static String toString(boolean b) {
        return b ? "true" : "false";
    }

따라서 두 방법 모두 똑같이 효율적입니다.