Bisakah seseorang mengetahui ukuran bit boolean di Java?
Jawaban:
Ini bergantung pada mesin virtual.
Itu tergantung pada mesin virtual, tetapi mudah untuk menyesuaikan kode dari pertanyaan serupa yang menanyakan tentang byte di 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();
}
}
Untuk mengulangi, ini bergantung pada VM, tetapi pada laptop Windows saya yang menjalankan JDK build 1.6.0_11 Sun, saya mendapatkan hasil sebagai berikut:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Itu menunjukkan bahwa boolean pada dasarnya dapat dikemas menjadi satu byte masing-masing oleh JVM Sun.
Informasi aktual yang diwakili oleh nilai boolean di Java adalah satu bit: 1 untuk benar, 0 untuk salah. Namun, ukuran sebenarnya dari variabel boolean dalam memori tidak ditentukan secara tepat oleh spesifikasi Java. Lihat Tipe Data Primitif di Java .
Tipe data boolean hanya memiliki dua kemungkinan nilai: benar dan salah. Gunakan tipe data ini untuk tanda sederhana yang melacak kondisi benar / salah. Tipe data ini mewakili satu bit informasi, tetapi "ukurannya" bukanlah sesuatu yang didefinisikan dengan tepat.
Di samping catatan ...
Jika Anda berpikir tentang menggunakan larik objek Boolean, jangan. Gunakan BitSet sebagai gantinya - ini memiliki beberapa optimisasi kinerja (dan beberapa metode tambahan yang bagus, memungkinkan Anda untuk mendapatkan bit set / unset berikutnya).
Saya membaca bahwa Java mencadangkan satu byte untuk boolean
tipe data, tetapi hanya menggunakan satu bit. Namun, dokumentasi mengatakan bahwa "ukurannya" bukanlah sesuatu yang didefinisikan dengan tepat " .
Lihat disini.
The boolean
nilai-nilai yang dikompilasi untuk int
tipe data di JVM. Lihat disini .
Ukuran boolean di java bergantung pada mesin virtual. tetapi Objek Java apa pun disejajarkan dengan perincian 8 byte. Sebuah Boolean memiliki 8 byte header, ditambah 1 byte payload, dengan total 9 byte informasi. JVM kemudian membulatkannya ke kelipatan 8. sehingga satu instance java.lang.Boolean membutuhkan 16 byte memori.
Boolean
sungguh sia-sia ... itu ukuran long
yang dapat membawa informasi triliun kali lebih banyak daripadaBoolean
Ini tidak ditentukan; melakukan hal-hal seperti yang disarankan Jon Skeet akan memberi Anda perkiraan pada platform tertentu, tetapi cara untuk mengetahui secara tepat untuk platform tertentu adalah dengan menggunakan profiler.