Peut on dire la taille en bits de booléens en java?
Réponses
Trop de publicités?Cela dépend de la machine virtuelle, mais il est facile d'adapter le code à partir d'une même question de poser à propos des octets en 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();
}
}
Pour rappel, c'est VM-dépendante, mais sur mon ordinateur portable Windows exécutant Sun JDK construire 1.6.0_11 j'ai obtenu les résultats suivants:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Cela suggère que les booléens peuvent être emballés dans un octet chacun par Sun JVM.
L'information elle-même représentée par une valeur booléenne en Java est un bit: 1 pour true, 0 pour faux. Cependant, la taille réelle d'une variable booléenne dans la mémoire n'est pas précisément défini par la spécification de Java. Voir Types de Données Primitifs en Java.
Le type de données boolean a seulement deux valeurs possibles: true et false. Utilisation ce type de données pour de simples indicateurs de piste true/false conditions. Ces données type représente un bit de les informations, mais sa "taille" n'est-ce pas quelque chose qui est précisément défini.
J'ai lu que Java se réserve un octet pour un boolean
type de données, mais il utilise seulement un peu.
Toutefois, la documentation dit que "sa "taille" n'est pas quelque chose qui est précisément définies".
Voir ici.