2011-07-20 9 views
17

Chcę przechowywać listę podwójnych i intów do ByteBuffer, który prosi o przydzielenie rozmiaru. Chciałbym napisać coś jak C SkładniaNajlepsza praktyka uzyskiwania rozmiaru danych (sizeof) w Javie

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

Ale nie ma sizeof w Javie. Jaka jest najlepsza praktyka obliczania rozmiaru w bajcie? Czy powinienem to skasować?

+0

Tak powinieneś. – tskuzzy

+0

[JLS] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2) określa dokładnie rozmiar typów pierwotnych. (ale nie widzę rozmiaru boolean). – Atreys

Odpowiedz

37

(Jeśli używasz Java 8 lub poza, być pewny patrzeć @Frank Kusters' answer!)

Wszystkie prymitywnych owijarki mają wielkość stałą, która jest w bitach, a nie bajtów.

więc w podanym przykładzie będzie to:

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

Lub, jeśli chciał uniknąć podziału:

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

(Ponieważ podział jest z dwóch stałych, to się robi w czas kompilacji.)

+1

Podpisałem [sugestię ulepszenia] (http://code.google.com/p/guava-libraries/issues/detail?id=668&can=6&colspec=ID%20Type%20Status%20Milestone%20Summary) dla Guava, aby to trochę mniej gadatliwe. –

3

Rozmiar w Javie jest zawsze taki sam. Możesz go zakodować na stałe, ale musisz to zrobić tylko dlatego, że pracujesz z bajtami w ByteBuffer. Jeśli używasz double[] lub DoubleBuffer, nie potrzebujesz ich.

+0

Z naciskiem na NIO.2 w JDK 7. Ta odpowiedź jest najlepszą praktyką. – Sam

+1

Nie, jeśli używasz NIO do łączenia się z innymi interfejsami API, takimi jak OpenGL, które nadal wymagają liczby bajtów (nie liczb). – mlepage

+0

Jaki jest rozmiar w Java? – Joehot200

8

Napisz własną metodę. W Java typy danych są niezależne od platformy zawsze taki sam rozmiar:

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) 
} 

Zastosowanie:

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

sugestia: użyj 'switch case' dla lepszej czytelności, java 7 obsługuje ciągi w instrukcjach przełączania. – thoughtbot

+9

Myślę, że czytelność jest świetna. Używanie Strings zrujnowałoby wydajność. –

5

Lepszym rozwiązaniem może być nie emulować składnię C i użyć ObjectOutputStream z zagnieżdżonego ByteArrayOutputStream wygenerować bajt tablica, którą można następnie zapisać w ByteBufferze.

0

Można również korzystać z biblioteki sizeof4j uzyskać sizeof podwójne wystarczy SizeOf.doubleSize()

Powiązane problemy