Может ли кто-нибудь сказать размер логического значения в Java?
Ответы:
Это зависит от виртуальной машины.
boolean: The boolean data type... This data type represents one bit of information, but its "size" isn't something that's precisely defined
- но ваша точка зрения верна, можно использовать некоторые ссылки и лучшую информацию :)
Это зависит от виртуальной машины, но легко адаптировать код из аналогичного вопроса о байтах в 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();
}
}
Повторюсь, это зависит от виртуальной машины, но на моем ноутбуке с Windows под управлением Sun JDK build 1.6.0_11 я получил следующие результаты:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Это говорит о том, что логические значения могут быть упакованы в байт каждое с помощью JVM Sun.
Фактическая информация, представленная логическим значением в Java, составляет один бит: 1 - истина, 0 - ложь. Однако фактический размер логической переменной в памяти точно не определяется спецификацией Java. См. Примитивные типы данных в Java .
Тип данных boolean имеет только два возможных значения: true и false. Используйте этот тип данных для простых флагов, которые отслеживают истинные / ложные условия. Этот тип данных представляет один бит информации, но его «размер» не определен точно.
На стороне примечания ...
Если вы думаете об использовании массива логических объектов, не делайте этого. Вместо этого используйте BitSet - он имеет некоторую оптимизацию производительности (и несколько приятных дополнительных методов, позволяющих получить следующий бит установки / снятия).
Я читал, что Java резервирует один байт для типа boolean
данных, но использует только один бит. Однако в документации сказано, что «его« размер »не определен точно» .
Глянь сюда.
Эти boolean
значения сведены к int
типу данных в JVM. Смотрите здесь .
Размер логического значения в java зависит от виртуальной машины. но Любой объект Java выровнен с точностью до 8 байтов. Логическое значение имеет 8 байтов заголовка плюс 1 байт полезной нагрузки, что в сумме составляет 9 байтов информации. Затем JVM округляет его до следующего числа, кратного 8. Таким образом, один экземпляр java.lang.Boolean занимает 16 байт памяти.
Boolean
быть такой пустой тратой ... это размер a, long
который может нести в триллион раз больше информации, чем aBoolean
Это не определено; выполнение таких вещей, как предложил Джон Скит, даст вам приблизительное представление о данной платформе, но способ узнать точно для конкретной платформы - использовать профилировщик.