Respuesta corta: sí, los valores booleanos se manipulan como entidades de 32 bits, pero las matrices de booleanos usan 1 byte por elemento.
Respuesta más larga: la JVM usa una celda de pila de 32 bits, que se usa para contener variables locales, argumentos de método y valores de expresión. Las primitivas de menos de 1 celda se rellenan, las primitivas de más de 32 bits (largas y dobles) toman 2 celdas. Esta técnica minimiza el número de códigos de operación, pero tiene algunos efectos secundarios peculiares (como la necesidad de enmascarar bytes).
Las primitivas almacenadas en matrices pueden usar menos de 32 bits y existen diferentes códigos de operación para cargar y almacenar valores primitivos de una matriz. Los valores booleanos y de bytes usan ambos códigos de operación baloady bastore, lo que implica que las matrices booleanas toman 1 byte por elemento.
En lo que respecta al diseño de objetos en memoria, esto está cubierto por las reglas de "implementación privada" , puede ser de 1 bit, 1 byte o, como señaló otro cartel, alineado con un límite de palabra doble de 64 bits. Lo más probable es que tome el tamaño de palabra básico del hardware subyacente (32 o 64 bits).
En cuanto a minimizar la cantidad de espacio que usan los booleanos: realmente no es un problema para la mayoría de las aplicaciones. Los marcos de pila (que contienen variables locales y argumentos de método) no son muy grandes y, en el esquema grande, un booleano discreto en un objeto tampoco es tan grande. Si tiene muchos objetos con muchos valores booleanos, puede usar campos de bits que se administran a través de sus getters y setters. Sin embargo, pagará una penalización en el tiempo de CPU que probablemente sea mayor que la penalización en la memoria.
¡Un solo booleano en algún lugar de la jerarquía de herencia puede usar hasta 8 bytes! Esto se debe al acolchado. Se pueden encontrar más detalles en ¿Cuánta memoria utiliza mi objeto Java? :
fuente
La quinta edición de Java in a Nutshell (O'Reilly) dice que un tipo primitivo booleano es de 1 byte. Eso podría estar mal, según lo que muestra el examen del montón. Me pregunto si la mayoría de las JVM tienen problemas para asignar menos de un byte para las variables.
fuente
El mapeo booleano se realizó con una CPU de 32 bits en mente. El valor int tiene 32 bits, por lo que se puede procesar en una sola operación.
Aquí hay una solución de Java IAQ de Peter Norvig: Preguntas con respuestas poco frecuentes para medir el tamaño (con cierta imprecisión):
fuente
Las CPU operan en una longitud de tipo de datos específica. En el caso de las CPU de 32 bits, tienen una longitud de 32 bits y, por lo tanto, lo que se llama 'int' en Java. Todo lo que esté por debajo o por encima de lo que debe llenarse o dividirse a esta longitud antes de que la CPU pueda procesarlo. Esto no lleva mucho tiempo, pero si necesita 2 ciclos de CPU en lugar de 1 para operaciones básicas, esto significa duplicar los costos / tiempo.
Esta especificación está dedicada a las CPU de 32 bits para que puedan procesar valores booleanos con su tipo de datos nativo.
Aquí solo puede tener uno: velocidad o memoria: SUN se decidió por la velocidad.
fuente
Boolean representa un bit de información, pero su "tamaño" no es algo que esté definido con precisión, dicen los tutoriales de Sun Java. Los literales booleanos tienen solo dos valores posibles: verdadero y falso. Consulte Tipos de datos de Java para obtener más detalles.
fuente
¿Por qué no crear un archivo .java como este?
Empty.java
y una clase como esta:
NotEmpty.java
Compile ambos y compare los archivos .class con un editor hexadecimal.
fuente