Qual é o tamanho de uma variável booleana em Java?

Alguém pode dizer o tamanho do bit booleano em Java?

É dependente de máquina virtual.

Depende da máquina virtual, mas é fácil adaptar o código de uma pergunta semelhante perguntando sobre bytes em Java :

 class LotsOfBooleans { boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af; boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf; boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf; boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df; boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef; } class LotsOfInts { int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af; int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf; int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf; int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df; int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef; } public class Test { private static final int SIZE = 1000000; public static void main(String[] args) throws Exception { LotsOfBooleans[] first = new LotsOfBooleans[SIZE]; LotsOfInts[] second = new LotsOfInts[SIZE]; System.gc(); long startMem = getMemory(); for (int i=0; i < SIZE; i++) { first[i] = new LotsOfBooleans(); } System.gc(); long endMem = getMemory(); System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem)); System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE))); System.gc(); startMem = getMemory(); for (int i=0; i < SIZE; i++) { second[i] = new LotsOfInts(); } System.gc(); endMem = getMemory(); System.out.println ("Size for LotsOfInts: " + (endMem-startMem)); System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE))); // Make sure nothing gets collected long total = 0; for (int i=0; i < SIZE; i++) { total += (first[i].a0 ? 1 : 0) + second[i].a0; } System.out.println(total); } private static long getMemory() { Runtime runtime = Runtime.getRuntime(); return runtime.totalMemory() - runtime.freeMemory(); } } 

Para reiterar, isso é dependente da VM, mas no meu laptop Windows executando o JDK build 1.6.0_11 da Sun, obtive os seguintes resultados:

 Size for LotsOfBooleans: 87978576 Average size: 87.978576 Size for LotsOfInts: 328000000 Average size: 328.0 

Isso sugere que os booleanos podem basicamente ser empacotados em um byte cada pela JVM da Sun.

A informação real representada por um valor booleano em Java é um bit: 1 para true, 0 para false. No entanto, o tamanho real de uma variável booleana na memory não é precisamente definido pela especificação Java. Veja Tipos de dados primitivos em Java .

O tipo de dados booleano tem apenas dois valores possíveis: verdadeiro e falso. Use esse tipo de dados para sinalizadores simples que rastreiam condições verdadeiras / falsas. Esse tipo de dados representa um bit de informação, mas seu “tamanho” não é algo precisamente definido.

Em uma nota lateral …

Se você está pensando em usar uma matriz de objects booleanos, não. Use um BitSet em vez disso – ele tem algumas otimizações de desempenho (e alguns methods extras agradáveis, permitindo que você obtenha o próximo conjunto / indefinido).

Eu li que o Java reserva um byte para um boolean dados boolean , mas ele usa apenas um bit. No entanto, a documentação diz que “seu” tamanho “não é algo que é precisamente definido” . Veja aqui.

Os valores boolean são compilados para o tipo de dados int na JVM. Veja aqui

O tamanho do booleano em java é dependente da máquina virtual. mas qualquer object Java é alinhado a uma granularidade de 8 bytes. Um booleano tem 8 bytes de header, mais 1 byte de carga, para um total de 9 bytes de informação. A JVM então a arredonda para o próximo múltiplo de 8. assim, a instância de java.lang.Boolean ocupa 16 bytes de memory.

É indefinido; fazer coisas como Jon Skeet sugeriu lhe dará uma aproximação em uma determinada plataforma, mas a maneira de saber precisamente para uma plataforma específica é usar um profiler.