web-dev-qa-db-fra.com

Méthode recommandée pour obtenir la taille de type de données (sizeof) en Java

Je veux stocker une liste des doublons et des entrées dans un ByteBuffer, qui demande une taille à allouer. J'aimerais écrire quelque chose comme la syntaxe de C

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

Mais il n'y a pas sizeof en Java. Quelle est la meilleure pratique pour calculer la taille en octet? Dois-je le coder en dur?

19
Wei Shi

(Si vous utilisez Java 8 ou une version ultérieure, veillez à regarder @Frank Kusters 'answer !)

Toutes les enveloppes de primitives ont une constante SIZE, qui est exprimée en bits et non en octets.

Donc, dans l'exemple donné, ce serait:

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

Ou, si vous vouliez éviter la division:

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

(Comme la division est constituée de deux constantes, cela se fait au moment de la compilation.)

42
Ed Staub

Depuis Java 8, toutes les classes d'encapsuleur de types primitifs (à l'exception de Boolean) ont un champ BYTES. Donc dans votre cas:

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

Documentation: http://docs.Oracle.com/javase/8/docs/api/Java/lang/Integer.html

16
Frank Kusters

Écrivez votre propre méthode. En Java, les types de données sont indépendants de la plate-forme et ont toujours la même taille:

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);
9
Martijn Courteaux

Une meilleure solution pourrait être de ne pas émuler la syntaxe C et d'utiliser un ObjectOutputStream avec un ByteArrayOutputStream imbriqué pour générer un tableau d'octets qui peut ensuite être écrit sur votre ByteBuffer.

5
drewjd

La taille en Java est toujours la même. Vous pouvez le coder en dur mais vous devez seulement le faire car vous travaillez avec des octets dans un ByteBuffer. Si vous utilisez double[] ou DoubleBuffer, vous n'en avez pas besoin.

3
Peter Lawrey

Vous pouvez également utiliser la bibliothèque sizeof4j pour obtenir la taille du double dont vous avez juste besoin SizeOf.doubleSize()

0
Artur Mkrtchyan