Ответ 1
Это зависит от виртуальной машины.
Может ли кто-нибудь сказать размер бита boolean в Java?
Это зависит от виртуальной машины.
Это зависит от виртуальной машины, но легко адаптировать код из аналогичного вопроса о байтах в 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();
}
}
Повторить, это зависит от VM, но на моем ноутбуке Windows, работающем под Sun JDK build 1.6.0_11, я получил следующие результаты:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Это говорит о том, что булевы в основном могут быть упакованы в байты каждый с помощью Sun JVM.
Фактическая информация, представленная логическим значением в Java, является одной бит: 1 для true, 0 для false. Однако фактический размер булевой переменной в памяти точно не определен спецификацией Java. См. Примитивные типы данных в Java.
Булевский тип данных имеет только два возможные значения: true и false. использование этот тип данных для простых флагов, которые отслеживать истинные/ложные условия. Эти данные тип представляет собой один бит информации, но его "размер" не то, что точно определено.
На боковой ноте...
Если вы думаете об использовании массива логических объектов, не делайте этого. Вместо этого используйте BitSet - у него есть оптимизация производительности (и некоторые дополнительные дополнительные методы, позволяющие вам получить следующий бит набора/отмены).
Я читал, что Java резервирует один байт для типа данных boolean
, но использует только один бит.
Однако в документации говорится, что "его" размер "не является тем, что точно определено" .
Смотрите здесь.
Значения boolean
скомпилированы в тип данных int
в JVM. См. здесь.
Размер булева в java зависит от виртуальной машины. но любой объект Java привязан к размерности 8 байт. Булевский имеет 8 байтов заголовка плюс 1 байт полезной нагрузки, всего 9 байт информации. Затем JVM округляет его до следующего кратного 8. поэтому один экземпляр java.lang.Boolean занимает 16 байт памяти.
Я очень рад, что у меня есть ответ только сейчас. так что теперь я хочу поделиться им со всеми вами.
во-первых, давайте прочитаем документ Oracle в http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html,
то вы прочтете это ниже:
"boolean: тип данных boolean имеет только два возможных значения: true и false. Используйте этот тип данных для простых флагов, которые отслеживают условия true/false. Этот тип данных представляет собой один бит информации, но его размер" это не то, что точно определено".
следовательно, мы можем знать, что не задан логический размер, , возможно, 4 байта нравится int, или, может быть, байты размером 1 байт,, но, что я могу убедитесь, что он не может быть 1 бит. Я думаю, что причина явно.
Желаем, чтобы это вам помогло.
Это undefined; такие вещи, как предложенный Джоном Скитом, приблизит вас к определенной платформе, но способ точно знать определенную платформу - использовать профилировщик.
Он определяется другой машиной java.