Лучшая практика получения размера данных (sizeof) в Java
Я хочу, чтобы в список ByteBuffer был добавлен список удвоений и ints, который запрашивает размер для выделения. Я хотел бы написать что-то вроде синтаксиса C
int size=numDouble*sizeof(double)+numInt*sizeof(int);
Но в Java нет sizeof
. Какова наилучшая практика для расчета размера байта? Должен ли я его жестко задавать?
Ответы
Ответ 1
(Если вы используете Java 8 или выше, обязательно посмотрите ответ @Frank Kusters!)
Все примитивные обертки имеют константу SIZE, которая находится в битах, а не в байтах.
Итак, в приведенном примере это будет:
int size=(numDouble*Double.SIZE+numInt*Integer.SIZE) / Byte.SIZE;
Или, если вы хотите избежать разделения:
int size=numDouble*(Double.SIZE/Byte.SIZE)+numInt*(Integer.SIZE/Byte.SIZE);
(Поскольку деление имеет две константы, это было сделано во время компиляции.)
Ответ 2
Так как Java 8, все классы-оболочки примитивных типов (кроме Boolean
) имеют поле BYTES
. Итак, в вашем случае:
int size = numDouble * Double.BYTES + numInt * Integer.BYTES;
Документация: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Ответ 3
Напишите свой собственный метод. В 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);
Ответ 4
Лучшим решением может быть не эмуляция синтаксиса Си и использование ObjectOutputStream с вложенным ByteArrayOutputStream для генерации массива байтов, который затем может быть записан в ваш ByteBuffer.
Ответ 5
Размер в Java всегда один и тот же. Вы можете жестко закодировать его, но вам нужно только это сделать, потому что вы работаете с байтами в ByteBuffer. Если вы используете double[]
или DoubleBuffer
, вам это не нужны.
Ответ 6
Вы также можете использовать библиотеку sizeof4j, чтобы получить размер double, который вам просто нужен SizeOf.doubleSize()