Czy ktoś może określić wielkość bitową wartości logicznej w Javie?
Odpowiedzi:
To zależy od maszyny wirtualnej.
boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined
- ale twój punkt jest ważny,
Zależy to od maszyny wirtualnej, ale łatwo jest dostosować kod z podobnego pytania z pytaniem o bajty w Javie :
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();
}
}
Powtórzę, jest to zależne od maszyny wirtualnej, ale na moim laptopie z systemem Windows z JDK firmy Sun w wersji 1.6.0_11 otrzymałem następujące wyniki:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
To sugeruje, że wartości logiczne mogą być w zasadzie pakowane w bajty przez JVM firmy Sun.
Faktyczna informacja reprezentowana przez wartość logiczną w Javie to jeden bit: 1 dla prawdy, 0 dla fałszu. Jednak rzeczywisty rozmiar zmiennej boolowskiej w pamięci nie jest dokładnie zdefiniowany w specyfikacji Java. Zobacz prymitywne typy danych w Javie .
Logiczny typ danych ma tylko dwie możliwe wartości: prawda i fałsz. Użyj tego typu danych dla prostych flag, które śledzą warunki prawda / fałsz. Ten typ danych reprezentuje jeden bit informacji, ale jego „rozmiar” nie jest dokładnie zdefiniowany.
Na marginesie...
Jeśli myślisz o użyciu tablicy obiektów boolowskich, nie rób tego. Zamiast tego użyj BitSetu - ma pewne optymalizacje wydajności (i kilka fajnych dodatkowych metod, pozwalających na uzyskanie następnego ustawionego / nieustawionego bitu).
Czytałem, że Java rezerwuje jeden bajt dla boolean
typu danych, ale używa tylko jednego bitu. Jednak dokumentacja mówi, że „jego„ rozmiar ”nie jest dokładnie zdefiniowany” .
Spójrz tutaj.
Te boolean
wartości są kompilowane do int
typu danych w JVM. Zobacz tutaj .
Rozmiar wartości logicznej w Javie zależy od maszyny wirtualnej. ale każdy obiekt Java jest wyrównany do 8-bajtowej szczegółowości. Boolean ma 8 bajtów nagłówka plus 1 bajt ładunku, co daje łącznie 9 bajtów informacji. Następnie maszyna JVM zaokrągla ją w górę do następnej wielokrotności liczby 8., więc jedna instancja java.lang.Boolean zajmuje 16 bajtów pamięci.
Boolean
będzie marnotrawstwem ... to rozmiar a, long
który może pomieścić bilion razy więcej informacji niż aBoolean
To jest nieokreślone; robienie rzeczy, jak sugerował Jon Skeet, przyniesie przybliżenie na danej platformie, ale sposobem na dokładne poznanie konkretnej platformy jest użycie profilera.