Qualcuno può dire la dimensione in bit di booleano in Java?
Risposte:
Dipende dalla macchina virtuale.
Dipende dalla macchina virtuale, ma è facile adattare il codice da una domanda simile che chiede i byte in 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();
}
}
Per ribadire, questo dipende dalla VM, ma sul mio laptop Windows con build 1.6.0_11 di Sun JDK ho ottenuto i seguenti risultati:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Ciò suggerisce che i booleani possono essere fondamentalmente impacchettati in un byte ciascuno dalla JVM di Sun.
Le informazioni effettive rappresentate da un valore booleano in Java sono un bit: 1 per vero, 0 per falso. Tuttavia, la dimensione effettiva di una variabile booleana in memoria non è definita con precisione dalla specifica Java. Vedere Tipi di dati primitivi in Java .
Il tipo di dati booleano ha solo due possibili valori: vero e falso. Usa questo tipo di dati per flag semplici che tengono traccia di condizioni vere / false. Questo tipo di dati rappresenta un bit di informazione, ma la sua "dimensione" non è definita con precisione.
In una nota a margine...
Se stai pensando di utilizzare un array di oggetti booleani, non farlo. Usa invece un BitSet: ha alcune ottimizzazioni delle prestazioni (e alcuni simpatici metodi extra, che ti consentono di ottenere il successivo bit impostato / non impostato).
Ho letto che Java riserva un byte per un boolean
tipo di dati, ma utilizza solo un bit. Tuttavia, la documentazione dice che "la sua" dimensione "non è qualcosa che è definito con precisione" .
Vedere qui.
I boolean
valori vengono compilati nel int
tipo di dati in JVM. Vedi qui .
La dimensione del booleano in java dipende dalla macchina virtuale. ma qualsiasi oggetto Java è allineato a una granularità di 8 byte. Un booleano ha 8 byte di intestazione, più 1 byte di payload, per un totale di 9 byte di informazioni. La JVM quindi lo arrotonda per eccesso al successivo multiplo di 8. quindi l'unica istanza di java.lang.Boolean occupa 16 byte di memoria.
Boolean
sarebbe un tale spreco ... è la dimensione di un long
che può trasportare trilioni di volte più informazioni di unBoolean
Non è definito; fare cose come suggerito da Jon Skeet ti darà un'approssimazione su una data piattaforma, ma il modo per sapere con precisione per una piattaforma specifica è usare un profiler.