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


108

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

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

또는

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

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


이 두 가지 방법 의 소스 코드 를 보셨습니까 ?
Anony - 무스 - 종료 될

1
나는 선호한다 ""+b. 느리지 만 개발자에게는 더 효율적입니다. 최고의 성능을 원한다면 직접 ByteBuffer에 데이터를 쓸 수 있습니다. 즉, 문자열로 수행하는 작업을 변경하여 필요하지 않게 할 수 있습니다.
Peter Lawrey 2013-09-16

당신이 취급 할 경우에도 null같은 false, 당신은 사용할 수 있습니다String.format("%b", b)
ZhekaKozlov

답변:


145

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

당신이있는 경우 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

기본 부울의 경우 차이가 없습니다.


1
테스트 스 니펫은 1입니다!
gaurav

28

귀하의 가치가 아니라고 확신하는 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


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

코드의 형식을 올바르게 지정하고 몇 가지 설명을 제공하십시오.
helloflash

3

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

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

1

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

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

그러나 프로덕션 용도로 다른 방법을 사용하는 것이 좋습니다. 이것은 디버깅에 유용한 간단하고 빠른 솔루션입니다.


프로덕션 용도로 사용하지 않는 이유를 자세히 설명해 주시겠습니까? 일부 시나리오에서 실패 할 수 있습니까?
lazyvab

@lazyvab 솔직히 말해서 나는 전혀 모른다! 나는 더 이상 자바를 쓰지 않지만 그것이 내가 들었을 것입니다. 지난 몇 년 동안 다른 언어로 프로그래밍 해 왔지만 프로덕션에서 이것을 사용하는 것이 왜 나쁠 지 알 수 없습니다. 게다가 System.out.println오른쪽 어쨌든 디버깅입니까?
jskidd3

1

"효율적"이라는 의미에 따라 다릅니다. 성능면에서 두 버전 모두 동일한 바이트 코드와 동일합니다.

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

0

두 가지 방법의 구현을 보면 동일하게 보입니다.

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.