Лучшая практика для получения размера типа данных (sizeof) в Java - PullRequest
21 голосов
/ 20 июля 2011

Я хочу сохранить список двойных и целых чисел в ByteBuffer, который запрашивает размер для выделения.Я хотел бы написать что-то вроде синтаксиса C

int size=numDouble*sizeof(double)+numInt*sizeof(int);

Но в Java нет sizeof.Какова лучшая практика для расчета размера в байтах?Стоит ли мне это жестко закодировать?

Ответы [ 6 ]

43 голосов
/ 21 июля 2011

(Если вы используете Java 8 или более позднюю версию, обязательно посмотрите @ ответ Фрэнка Кастерса !)

Все примитивные оболочки имеют константу SIZE, которая выражается в битах, а не в байтах.

Итак, в приведенном примере это будет:

int size=(numDouble*Double.SIZE+numInt*Integer.SIZE) / Byte.SIZE;

Или, если вы хотите избежать разделения:

int size=numDouble*(Double.SIZE/Byte.SIZE)+numInt*(Integer.SIZE/Byte.SIZE);

(Поскольку деление состоит из двух констант, оно выполняется во время компиляции.)

19 голосов
/ 18 июля 2014

Начиная с Java 8, все классы-обертки примитивных типов (кроме Boolean) имеют поле BYTES. Итак, в вашем случае:

int size = numDouble * Double.BYTES + numInt * Integer.BYTES;

Документация: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

9 голосов
/ 20 июля 2011

Напишите свой собственный метод.В Java типы данных не зависят от платформы и всегда имеют одинаковый размер:

public static int sizeof(Class dataType)
{
    if (dataType == null) throw new NullPointerException();

    if (dataType == int.class    || dataType == Integer.class)   return 4;
    if (dataType == short.class  || dataType == Short.class)     return 2;
    if (dataType == byte.class   || dataType == Byte.class)      return 1;
    if (dataType == char.class   || dataType == Character.class) return 2;
    if (dataType == long.class   || dataType == Long.class)      return 8;
    if (dataType == float.class  || dataType == Float.class)     return 4;
    if (dataType == double.class || dataType == Double.class)    return 8;

    return 4; // 32-bit memory pointer... 
              // (I'm not sure how this works on a 64-bit OS)
}

Использование:

int size = numDouble * sizeof(double.class) + numInt * sizeof(int.class);
5 голосов
/ 20 июля 2011

Лучшим решением может быть не эмулировать синтаксис C и использовать ObjectOutputStream с вложенным ByteArrayOutputStream для генерации байтового массива, который затем может быть записан в ваш ByteBuffer.

3 голосов
/ 20 июля 2011

Размер на Java всегда одинаков.Вы можете жестко закодировать его, но вам нужно сделать это только потому, что вы работаете с байтами в ByteBuffer.Если вы используете double[] или DoubleBuffer, они вам не нужны.

0 голосов
/ 03 декабря 2014

Вы также можете использовать библиотеку sizeof4j , чтобы получить размер двойника, который вам нужен SizeOf.doubleSize()

...