バイトに基づいてJava配列にインデックスを付けることは可能ですか?
つまり、次のようなもの
array[byte b] = x;
ファイルから b (上記のコード) を読み取る非常にパフォーマンスが重要なアプリケーションがあり、これを int に変換するオーバーヘッドは必要ありません。これを達成するための最良の方法は何ですか?int ではなくこのインデックス方法を使用した結果、パフォーマンスが低下しますか?
多くの感謝とともに、
フロスコイ。
「これをintに変換する」ためのオーバーヘッドはありません。Javaバイトコードレベルでは、すべてbyte
のsはすでにint
sです。
int
いずれにせよ、配列のインデックス作成を行うと、とにかく自動的にアップキャストされます。これらのいずれもパフォーマンスを向上させることはなく、多くはパフォーマンスを低下させます。を使用してコードを残すだけint
です。
表2.2のほとんどの命令には、整数型byte、char、およびshortの形式がないことに注意してください。ブール型のフォームはありません。コンパイラは、コンパイル時または実行時にこれらの値をint型の値に符号拡張するJava仮想マシン命令を使用して、byte型およびshort型のリテラル値のロードをエンコードします。boolean型とchar型のリテラル値のロードは、コンパイル時または実行時にリテラルをint型の値にゼロ拡張する命令を使用してエンコードされます。同様に、boolean、byte、short、およびchar型の値の配列からのロードは、値をint型の値に符号拡張またはゼロ拡張するJava仮想マシン命令を使用してエンコードされます。したがって、実際の型boolean、byte、char、およびshortの値に対するほとんどの操作は、計算型intの値を操作する命令によって正しく実行されます。
Javaのすべての整数型は署名されているため、0x7Fより大きいファイル値から読み取ることが期待される場合は、bの値の8ビットをマスクする必要があります。
byte b;
byte a[256];
a [b & 0xFF] = x;
いいえ; 配列インデックスは非負の整数(JLS 10.4)ですが、バイトインデックスがプロモートされます。