Best Practice for Getting Datatype Size(Sizeof) in Java
I Want Store a List of Doubles and Ints to a Bytebuffer, Which Asks for a Size to Allocate. I'd Like to Write Something Like C's Syntax Int...
I want store a list of doubles and ints to a ByteBuffer, which asks for a size to allocate. I'd like to write something like C's syntax
int size=numDouble*sizeof(double)+numInt*sizeof(int);
But there is no sizeof in Java. What is the best practice to calculate the size in byte? Should I hardcode it?
7 Answers
See @Frank Kusters' answer, below!
(My original answer here was for Java versions < 8.)
Since Java 8, all wrapper classes of primitive types (except Boolean) have a BYTES field. So in your case:
int size = numDouble * Double.BYTES + numInt * Integer.BYTES;
Documentation:
Write your own method. In Java the datatypes are platform independent always the same size:
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)
}
Usage:
int size = numDouble * sizeof(double.class) + numInt * sizeof(int.class);
A better solution might be to not emulate C syntax and use an ObjectOutputStream with a nested ByteArrayOutputStream to generate a byte array which can then be written to your ByteBuffer.
The size in Java is always the same. You can hardcode it but you only need to do this because you are working with bytes in a ByteBuffer. If you use double[] or DoubleBuffer you don't need these.
You can also use the sizeof4j library to get the sizeof the double you just need SizeOf.doubleSize()
Automated and abstract solution is to write the sample to DataOutput and see the resulted size.