Reputation: 5055
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?
Upvotes: 31
Views: 74536
Reputation: 15690
See @Frank Kusters' answer, below!
(My original answer here was for Java versions < 8.)
Upvotes: 49
Reputation: 105
Automated and abstract solution is to write the sample to DataOutput and see the resulted size.
Upvotes: 0
Reputation: 981
You can also use the sizeof4j library to get the sizeof the double you just need SizeOf.doubleSize()
Upvotes: 1
Reputation: 2634
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: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Upvotes: 39
Reputation: 51
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.
Upvotes: 5
Reputation: 68907
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);
Upvotes: 9
Reputation: 533790
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.
Upvotes: 3