Resposta curta: sim, os valores booleanos são manipulados como entidades de 32 bits, mas os arrays de booleanos usam 1 byte por elemento.
Resposta mais longa: a JVM usa uma pilha de células de 32 bits, usada para conter variáveis locais, argumentos de método e valores de expressão. Os primitivos menores que 1 célula são preenchidos, os primitivos maiores que 32 bits (longos e duplos) ocupam 2 células. Essa técnica minimiza o número de opcodes, mas tem alguns efeitos colaterais peculiares (como a necessidade de mascarar bytes).
Primitivos armazenados em matrizes podem usar menos de 32 bits, e existem opcodes diferentes para carregar e armazenar valores primitivos de uma matriz. Os valores booleanos e de byte usam opcodes baload
e bastore
, o que implica que os arrays booleanos usam 1 byte por elemento.
No que diz respeito ao layout de objeto na memória, isso é coberto pelas regras de "implementação privada" , pode ser de 1 bit, 1 byte ou, como outro usuário observou, alinhado a um limite de palavra dupla de 64 bits. Provavelmente, leva o tamanho de palavra básico do hardware subjacente (32 ou 64 bits).
No que diz respeito a minimizar a quantidade de espaço que os booleanos usam: realmente não é um problema para a maioria dos aplicativos. Os frames da pilha (contendo variáveis locais e argumentos de método) não são muito grandes e, no grande esquema, um booleano discreto em um objeto também não é tão grande. Se você tiver muitos objetos com muitos booleanos, poderá usar campos de bits que são gerenciados por meio de seus getters e setters. No entanto, você pagará uma penalidade no tempo de CPU que provavelmente é maior do que a penalidade na memória.
Um único booleano em algum lugar na hierarquia de herança pode usar até 8 bytes! Isso se deve ao preenchimento. Mais detalhes podem ser encontrados em Quanta memória é usada por meu objeto Java? :
fonte
A 5ª edição do Java in a Nutshell (O'Reilly) diz que um tipo primitivo booleano tem 1 byte. Isso pode estar errado, com base no que o exame da pilha está mostrando. Eu me pergunto se a maioria das JVMs tem problemas com a alocação de menos de um byte para variáveis.
fonte
O mapeamento booleano foi feito com uma CPU de 32 bits em mente. O valor int tem 32 bits, portanto, pode ser processado em uma operação.
Aqui está uma solução do Java IAQ de Peter Norvig: Perguntas pouco respondidas para medir o tamanho (com alguma imprecisão):
fonte
CPUs operam em um comprimento de tipo de dados específico. No caso de CPUs de 32 bits, eles têm 32 bits e, portanto, são chamados de 'int' em Java. Tudo abaixo ou acima disso deve ser preenchido ou dividido neste comprimento antes que a CPU possa processá-lo. Isso não leva muito tempo, mas se você precisar de 2 ciclos de CPU em vez de 1 para operações básicas, isso significa custos / tempo dobrados.
Esta especificação é dedicada a CPUs de 32 bits para que possam processar booleanos com seu tipo de dados nativo.
Você só pode ter um aqui: velocidade ou memória - SUN decidiu pela velocidade.
fonte
Boolean representa um bit de informação, mas seu "tamanho" não é algo definido com precisão, dizem os tutoriais Sun Java. Literais booleanos têm apenas dois valores possíveis: verdadeiro e falso. Consulte Tipos de dados Java para obter detalhes.
fonte
Por que não criar um arquivo .java como este:
Empty.java
e uma classe como esta:
NotEmpty.java
Compile os dois e compare os arquivos .class com um editor hexadecimal.
fonte