Booleano vs booleano em Java


195

Há discussões em torno de Integervs intem Java. O valor padrão do primeiro é nullenquanto no segundo é 0. Que tal Booleanvs boolean?

Uma variável no meu aplicativo pode ter 0/ 1valores. Eu gostaria de usar boolean/ Booleane prefiro não usar int. Posso usar Boolean/ em booleanvez disso?


2
Por motivos de design do sistema, eu escolheria Boolean, pois tem a opção "O usuário ainda não decidiu", que não é igual a "true", nem "false". Eu usaria primitivo booleano apenas nos casos se eu tiver 100% de certeza de que as opções true / false são suficientes. No banco de dados opção NULL é geralmente disponíveis sem problema (ou por apenas removendo restrições NOT NULL na demanda mais tarde)
CsBalazsHungary

2
Duplicata exata de Qual é a diferença entre booleano e booleano em Java? (porque o GWT não faz diferença).
Dan Dascalescu 07/01

Respostas:


270

Sim, você pode usar Boolean/ em booleanvez disso.

O primeiro é Objeto e o segundo é do tipo primitivo.

  • No primeiro, você terá mais métodos que serão úteis.

  • O segundo é barato, considerando as despesas com memória. O segundo economiza muito mais memória, então vá em frente

Agora escolha o seu caminho.


70
Você poderia ter formulado isso como "o segundo poupará muito mais memória, então vá em frente". Os métodos úteis no booleano podem ser invocados principalmente sem a ocorrência de uma instância.
DJClayworth

3
Contanto que você use Boolean.valueOf (value) do novo Boolean (value), a memória não deve ser uma preocupação.
Greg Case

2
pois AsyncTask, você só pode usar em Booleanvez de boolean.
Raptor

98
Note-se a um valor booleano realmente tem 3 estados ... true, falsee nullonde um boolean tem as lógicas 2 estados ( truee false)
respectTheCode

14
Booleana é trillean :)
Topera

50

Boolean quebra o tipo primitivo booleano. No JDK 5 e superior, a Oracle (ou a Sun antes da compra da Oracle) introduziu a caixa automática / unboxing , o que essencialmente permite que você faça isso

boolean result = Boolean.TRUE;

ou

Boolean result = true; 

O que essencialmente o compilador faz,

Boolean result = Boolean.valueOf(true);

Então, para sua resposta, é SIM.


4
Nota: nem sempre é possível atribuir com segurança Booleana a boolean. Se você Booleané nulle você tenta atribuí-lo a boolean, ele lançará um NullPointerExceptionem tempo de execução.
Duncan Luk

se Booleanuma classe, por que o valor é sempre falso, mesmo que eu tenha alterado o valor de outra classe que faz referência à mesma variável booleana? qual é o objetivo disso Boolean, se não podemos fazer referência a diferentes classes de instância / pass como argumento?
user924

encontrado uma resposta, podemos usar AtomicBooleane referenciá-lo a partir de classes de diferença
user924

35

Estou um pouco ampliando as respostas fornecidas (já que até agora elas se concentram em sua terminologia "própria" / artificial, concentrando-se em programar uma linguagem específica, em vez de cuidar da visão geral por trás da criação das linguagens de programação , em geral, ou seja, quando as coisas como considerações de segurança de tipo vs. memória fazem a diferença):

int não é booleano

Considerar

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

com saída

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

O código Java na terceira linha (bar)?1:0ilustra que a barra ( booleana ) não pode ser implicitamente convertida (convertida) em um int . Estou trazendo isso à tona não para ilustrar os detalhes da implementação por trás da JVM, mas para salientar que, em termos de considerações de baixo nível (como tamanho da memória), é preciso preferir valores à segurança do tipo. Especialmente se esse tipo de segurança não for verdadeira / totalmente utilizado como nos tipos booleanos em que as verificações são feitas na forma de

se o valor \ in {0,1}, em seguida, converter para o tipo booleano, caso contrário, lance uma exceção.

Tudo apenas para afirmar que {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Parece um exagero, certo? A segurança do tipo é realmente importante nos tipos definidos pelo usuário, não na conversão implícita de primitivos (embora o último esteja incluído no primeiro).

Bytes não são tipos ou bits

Observe que na memória sua variável do intervalo {0,1} ainda ocupará pelo menos um byte ou uma palavra (xbits, dependendo do tamanho do registro), a menos que seja especialmente cuidado (por exemplo, compactado na memória - 8 "booleano" bits em 1 byte - para frente e para trás).

Ao preferir a segurança do tipo (como colocar / embalar o valor em uma caixa de um tipo específico) em vez de empacotar um valor extra (por exemplo, usar troca de bits ou aritmética), escolhe-se efetivamente escrever menos código e ganhar mais memória. (Por outro lado, sempre é possível definir um tipo de usuário personalizado que facilitará toda a conversão que não valha mais que Boolean).

palavra-chave x tipo

Por fim, sua pergunta é sobre a comparação de palavra-chave x tipo . Eu acredito que é importante explicar por que ou como exatamente você obterá desempenho usando / preferindo palavras-chave ("marcadas" como primitivas ) sobre tipos (classes compostas normais definidas pelo usuário usando outra classe de palavras-chave ) ou em outras palavras

boolean foo = true;

vs.

Boolean foo = true;

A primeira "coisa" (tipo) não pode ser estendida (subclasse) e não sem um motivo. Efetivamente, a terminologia Java de classes primitivas e de quebra automática pode ser simplesmente traduzida em valor embutido (uma LITERAL ou uma constante que é diretamente substituída pelo compilador sempre que é possível inferir a substituição ou, se não for - ainda é uma alternativa para quebrar o valor).

A otimização é alcançada devido a trivial:

"Menos operações de conversão de tempo de execução => mais velocidade."

É por isso que, quando a inferência de tipo real é feita, ela pode (ainda) acabar instanciando a classe de quebra automática com todas as informações de tipo, se necessário (ou convertendo / convertendo em tal).

Portanto, a diferença entre booleano e booleano está exatamente em Compilation e Runtime (um pouco longe, mas quase como exemplo de vs getClass () ).

Por fim, a caixa automática é mais lenta que as primitivas

Observe que o Java pode fazer autoboxing é apenas um "açúcar sintático". Não acelera nada, apenas permite escrever menos código. É isso aí. A transmissão e o empacotamento no contêiner de informações de tipo ainda são executados. Por motivos de desempenho, escolha aritmética que sempre ignorará a limpeza extra da criação de instâncias de classe com informações de tipo para implementar a segurança de tipo. Falta de segurança de tipo é o preço que você paga para obter desempenho. Para código com expressões com valor booleano, digite safety (quando você escreve menos e, portanto, código implícito ) seria crítico, por exemplo, para controles de fluxo if-then-else.


16

Você pode usar as constantes booleanas - Boolean.TRUEe em Boolean.FALSEvez de 0e 1. Você pode criar sua variável como do tipo booleanse for o que você procura. Dessa forma, você não precisará criar novos Booleanobjetos.


3

Basicamente, booleano representa um tipo de dados primitivo, em que booleano representa um tipo de dados de referência. essa história é iniciada quando o Java quer se tornar puramente orientado a objetos, desde que o conceito de classe de wrapper seja usado para usar o tipo de dados primitivo.

boolean b1;
Boolean b2;

b1e b2não são iguais.


3

Uma observação: (embora isso possa ser pensado em efeito colateral)

ser booleano como primitivo pode dizer sim ou não.

Booleano é um objeto (pode se referir a sim ou não ou 'não sei', ou seja, nulo)


1

Você pode usar booleano / booleano. Simplicidade é o caminho a percorrer. Se você não precisa de API específica (coleções, fluxos, etc.) e não está prevendo que precisará delas - use a versão primitiva (booleana).

  1. Com os primitivos, você garante que não passará valores nulos.
    Você não cairá em armadilhas como esta. O código abaixo lança NullPointerException (de: Booleans, operadores condicionais e caixa automática ):

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. Use Boolean quando precisar de um objeto, por exemplo:

    • Fluxo de Booleanos,
    • Opcional
    • Coleções de booleanos
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.