Há discussões em torno de Integer
vs int
em Java. O valor padrão do primeiro é null
enquanto no segundo é 0
. Que tal Boolean
vs boolean
?
Uma variável no meu aplicativo pode ter 0
/ 1
valores. Eu gostaria de usar boolean
/ Boolean
e prefiro não usar int
. Posso usar Boolean
/ em boolean
vez disso?
Respostas:
Sim, você pode usar
Boolean
/ emboolean
vez 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.
fonte
AsyncTask
, você só pode usar emBoolean
vez deboolean
.true
,false
enull
onde um boolean tem as lógicas 2 estados (true
efalse
)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 issoou
O que essencialmente o compilador faz,
Então, para sua resposta, é SIM.
fonte
Boolean
a aboolean
. Se vocêBoolean
énull
e você tenta atribuí-lo aboolean
, ele lançará umNullPointerException
em tempo de execução.Boolean
uma 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 dissoBoolean
, se não podemos fazer referência a diferentes classes de instância / pass como argumento?AtomicBoolean
e referenciá-lo a partir de classes de diferençaEstou 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
com saída
O código Java na terceira linha
(bar)?1:0
ilustra 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 deTudo 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
vs.
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:
É 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.
fonte
Você pode usar as constantes booleanas -
Boolean.TRUE
e emBoolean.FALSE
vez de0
e1
. Você pode criar sua variável como do tipoboolean
se for o que você procura. Dessa forma, você não precisará criar novosBoolean
objetos.fonte
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.
b1
eb2
não são iguais.fonte
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)
fonte
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).
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; }
Use Boolean quando precisar de um objeto, por exemplo:
fonte