Java'da boole'nin bit boyutunu bilen var mı?
Yanıtlar:
Sanal makineye bağlıdır.
Sanal makineye bağlıdır, ancak kodu Java'daki baytlar hakkında sorulan benzer bir sorudan uyarlamak kolaydır :
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();
}
}
Tekrarlamak gerekirse, bu VM'ye bağlıdır, ancak Sun'ın JDK derlemesi 1.6.0_11 çalıştıran Windows dizüstü bilgisayarımda aşağıdaki sonuçları aldım:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Bu, mantıksal değerlerin temelde Sun'un JVM'si tarafından bir bayt olarak paketlenebileceğini gösteriyor.
Java'da bir boole değeri ile temsil edilen gerçek bilgi bir bittir: doğru için 1, yanlış için 0. Ancak, bellekteki bir boole değişkeninin gerçek boyutu Java spesifikasyonu tarafından kesin olarak tanımlanmamıştır. Java'daki İlkel Veri Türlerine bakın .
Boolean veri türünün yalnızca iki olası değeri vardır: true ve false. Doğru / yanlış koşullarını izleyen basit bayraklar için bu veri türünü kullanın. Bu veri türü bir bitlik bilgiyi temsil eder, ancak "boyutu" kesin olarak tanımlanmış bir şey değildir.
Yan notta ...
Bir dizi Boole nesnesi kullanmayı düşünüyorsanız, yapmayın. Bunun yerine bir BitSet kullanın - bazı performans optimizasyonları (ve bir sonraki set / unset biti almanıza izin veren bazı güzel ekstra yöntemler) vardır.
Java'nın bir boolean
veri türü için bir bayt ayırdığını, ancak yalnızca bir bit kullandığını okudum . Bununla birlikte, dokümantasyon "boyutunun" kesin olarak tanımlanmış bir şey olmadığını " söylüyor .
Buraya bakın.
boolean
Değerleri derlenmektedir int
JVM veri türü. Buraya bakın .
Java'daki boolean boyutu sanal makineye bağlıdır. ancak herhangi bir Java nesnesi 8 baytlık bir ayrıntı düzeyine hizalanır. Bir Boole, toplam 9 bayt bilgi için 8 bayt başlık ve 1 bayt yük içerir. JVM daha sonra onu 8'in sonraki katına yuvarlar, böylece java.lang.Boolean'ın bir örneği 16 bayt bellek kullanır.
Boolean
israf olur ... Bu long
Boolean
Tanımsız; Jon Skeet'in önerdiği gibi şeyler yapmak, size belirli bir platform hakkında bir yaklaşım getirecektir, ancak belirli bir platform için kesin olarak bilmenin yolu bir profilleyici kullanmaktır.