web-dev-qa-db-ja.com

Javaでデータ型size(sizeof)を取得するためのベストプラクティス

DoubleとintのリストをByteBufferに保存し、割り当てるサイズを要求します。 Cの構文のようなものを書きたい

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

しかし、Javaにはsizeofはありません。バイト単位でサイズを計算するためのベストプラクティスは何ですか?ハードコーディングする必要がありますか?

22
Wei Shi

(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つの定数であるため、コンパイル時に行われます。)

43
Ed Staub

Java 8)であるため、プリミティブ型のすべてのラッパークラス(Booleanを除く)にはBYTESフィールドがあります。

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

ドキュメント: http://docs.Oracle.com/javase/8/docs/api/Java/lang/Integer.html

19
Frank Kusters

独自のメソッドを作成します。 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);
9

より良い解決策は、C構文をエミュレートせず、ネストされたByteArrayOutputStreamでObjectOutputStreamを使用して、ByteBufferに書き込むことができるバイト配列を生成することです。

5
drewjd

Javaのサイズは常に同じです。ハードコーディングできますが、ByteBufferのバイトを使用しているため、これを行う必要があるだけです。double[]またはDoubleBufferこれらは必要ありません。

3
Peter Lawrey

sizeof4j ライブラリを使用して、必要なdoubleのsizeofを取得することもできますSizeOf.doubleSize()

0
Artur Mkrtchyan