Melhor abordagem para converter objeto booleano em string em java


108

Estou tentando converter booleano em tipo de string ...

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

ou

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

qual das opções acima seria mais eficiente?


Você já olhou o código-fonte desses dois métodos?
QUIT - Anony-Mousse

1
Eu prefiro ""+b. É mais lento, mas mais eficiente para o desenvolvedor. Se você deseja desempenho superior, pode gravar os dados de / para um ByteBuffer direto, ou seja, alterar o que você faz com a String para que não seja necessário.
Peter Lawrey

Além disso, se quiser tratar nullcomo false, você pode usarString.format("%b", b)
ZhekaKozlov

Respostas:


145

Eu não acho que haveria qualquer diferença significativa de desempenho entre eles, mas eu preferiria a 1ª forma.

Se tiver uma Booleanreferência, Boolean.toString(boolean)jogará NullPointerExceptionse for sua referência null. Como a referência é desempacotada booleanantes de ser passada para o método.

Enquanto o String.valueOf()método , como mostra o código-fonte, faz a nullverificação explícita :

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Basta testar este código:

Boolean b = null;

System.out.println(String.valueOf(b));    // Prints null
System.out.println(Boolean.toString(b));  // Throws NPE

Para booleano primitivo, não há diferença.


1
1 para os trechos de teste!
gaurav

28

Se tiver certeza de que seu valor não é, nullvocê pode usar a terceira opção, que é

String str3 = b.toString();

e seu código parece

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

Se você quiser ser null-safe, use o String.valueOf(b)código que se parece com

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

então, como você vê, ele primeiro testará nulle depois chamará o toString()método em seu objeto.


Chamar Boolean.toString(b)irá invocar

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

que é um pouco mais lento do que b.toString()uma vez que a JVM precisa primeiro desencaixotar Boolean para o booleanqual será passado como argumento Boolean.toString(...), enquanto b.toString()reutiliza o private boolean valuecampo no Booleanobjeto que mantém seu estado.


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

Tente formatar corretamente o seu código e dar algumas explicações.
helloflash

3

Se isso for com o propósito de obter um valor "verdadeiro" constante, em vez de "Verdadeiro" ou "VERDADEIRO", você pode usar isto:

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

1

Se você está procurando uma maneira rápida de fazer isso, por exemplo, depurando, você pode simplesmente concatenar uma string vazia no booleano:

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

No entanto, eu recomendo fortemente o uso de outro método para uso em produção. Esta é uma solução simples e rápida, útil para depuração.


Você pode explicar por que não recomenda o uso para uso em produção? Pode falhar em algum cenário?
lazyvab

@lazyvab Com toda a franqueza, não faço ideia! Não escrevo mais Java, mas só posso presumir que é algo que devo ter ouvido. Eu tenho programado em outras linguagens nos últimos anos, mas não consigo ver por que usar isso na produção faria mal. Além disso, System.out.printlné para depuração de qualquer maneira, certo?
jskidd3

1

Depende do que você entende por "eficiente". Em termos de desempenho, ambas as versões são iguais, pois são o mesmo bytecode.

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

Se você observar a implementação de ambos os métodos, eles terão a mesma aparência.

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

Portanto, os dois métodos são igualmente eficientes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.