Froskoy
Froskoy

Reputation: 3027

Java - indexing into array with a byte

Is it possible to index a Java array based on a byte?

i.e. something like

array[byte b] = x;

I have a very performance-critical application which reads b (in the code above) from a file, and I don't want the overhead of converting this to an int. What is the best way to achieve this? Is there a performance-decrease as a result of using this method of indexing rather than an int?

With many thanks,

Froskoy.

Upvotes: 1

Views: 4234

Answers (4)

Louis Wasserman
Louis Wasserman

Reputation: 198591

There's no overhead for "converting this to an int." At the Java bytecode level, all bytes are already ints.

In any event, doing array indexing will automatically upcast to an int anyway. None of these things will improve performance, and many will decrease performance. Just leave your code using an int.

The JVM specification, section 2.11.1:

Note that most instructions in Table 2.2 do not have forms for the integral types byte, char, and short. None have forms for the boolean type. Compilers encode loads of literal values of types byte and short using Java virtual machine instructions that sign-extend those values to values of type int at compile-time or runtime. Loads of literal values of types boolean and char are encoded using instructions that zero-extend the literal to a value of type int at compile-time or runtime. Likewise, loads from arrays of values of type boolean, byte, short, and char are encoded using Java virtual machine instructions that sign-extend or zero-extend the values to values of type int. Thus, most operations on values of actual types boolean, byte, char, and short are correctly performed by instructions operating on values of computational type int.

Upvotes: 6

Martijn Courteaux
Martijn Courteaux

Reputation: 68907

No, there is no performance decrease, because on the moment you read the byte, you store it in a CPU register sometime. Those registers always works with WORDs, which means that the byte is always "converted" to an int (or a long, if you are on a 64 bit machine).

So, simply read your byte like this:

int b = (in.readByte() & 0xFF);

If your application is that performance critical, you should be optimizing elsewhere.

Upvotes: 0

Serge
Serge

Reputation: 6095

As all integer types in java are signed you have anyway to mask out 8 bits of b's value provided you do expect to read from the file values greater than 0x7F:

byte b;
byte a[256];
a [b & 0xFF] = x;

Upvotes: 3

Dave Newton
Dave Newton

Reputation: 160321

No; array indices are non-negative integers (JLS 10.4), but byte indices will be promoted.

Upvotes: 0

Related Questions