Antworten:
Es ist abhängig von der virtuellen Maschine.
Dies hängt von der virtuellen Maschine ab, aber es ist einfach, den Code anhand einer ähnlichen Frage zu Bytes in Java anzupassen :
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();
}
}
Um es noch einmal zu wiederholen: Dies ist VM-abhängig, aber auf meinem Windows-Laptop mit Suns JDK Build 1.6.0_11 habe ich die folgenden Ergebnisse erhalten:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Dies deutet darauf hin, dass Boolesche Werte von Suns JVM grundsätzlich jeweils in ein Byte gepackt werden können.
Die tatsächliche Information, die in Java durch einen booleschen Wert dargestellt wird, ist ein Bit: 1 für wahr, 0 für falsch. Die tatsächliche Größe einer booleschen Variablen im Speicher wird jedoch durch die Java-Spezifikation nicht genau definiert. Siehe Primitive Datentypen in Java .
Der boolesche Datentyp hat nur zwei mögliche Werte: true und false. Verwenden Sie diesen Datentyp für einfache Flags, die True / False-Bedingungen verfolgen. Dieser Datentyp stellt ein Informationsbit dar, aber seine "Größe" ist nicht genau definiert.
Als Randnotiz...
Wenn Sie über die Verwendung eines Arrays von Booleschen Objekten nachdenken, tun Sie dies nicht. Verwenden Sie stattdessen ein BitSet - es enthält einige Leistungsoptimierungen (und einige nette zusätzliche Methoden, mit denen Sie das nächste gesetzte / nicht gesetzte Bit erhalten können).
Ich habe gelesen, dass Java ein Byte für einen boolean
Datentyp reserviert , aber nur ein Bit verwendet. Die Dokumentation besagt jedoch, dass "seine" Größe "nicht genau definiert ist" .
Siehe hier.
Die boolean
Werte werden int
in JVM zum Datentyp kompiliert . Siehe hier .
Die Größe des Booleschen Werts in Java hängt von der virtuellen Maschine ab. Jedes Java-Objekt ist jedoch auf eine 8-Byte-Granularität ausgerichtet. Ein Boolescher Wert enthält 8 Byte Header plus 1 Byte Nutzlast für insgesamt 9 Byte Information. Die JVM rundet es dann auf das nächste Vielfache von 8 auf, sodass die eine Instanz von java.lang.Boolean 16 Byte Speicher belegt.
Boolean
sind so eine Verschwendung ... das ist die Größe einer, long
die Billionen Mal mehr Informationen enthalten kann als eineBoolean
Es ist undefiniert; Wenn Sie Dinge tun, wie sie von Jon Skeet vorgeschlagen wurden, erhalten Sie eine Annäherung an eine bestimmte Plattform. Um jedoch genau über eine bestimmte Plattform Bescheid zu wissen, müssen Sie einen Profiler verwenden.