Java-使用字节索引到数组中

Java-使用字节索引到数组中,java,arrays,byte,Java,Arrays,Byte,是否可以基于字节索引Java数组 i、 例如 array[byte b] = x; 我有一个性能非常关键的应用程序,它从一个文件中读取b(在上面的代码中),我不希望将其转换为int的开销。实现这一点的最佳方法是什么?使用这种索引方法而不是int是否会导致性能下降 非常感谢, Froskoy.否,但是字节索引将被提升。否,但是字节索引将被提升。由于java中的所有整数类型都是有符号的,因此,如果您确实希望从大于0x7F的文件中读取值,则必须屏蔽8位b的值: byte b; byte a[256]

是否可以基于字节索引Java数组

i、 例如

array[byte b] = x;
我有一个性能非常关键的应用程序,它从一个文件中读取b(在上面的代码中),我不希望将其转换为int的开销。实现这一点的最佳方法是什么?使用这种索引方法而不是int是否会导致性能下降

非常感谢,


Froskoy.

否,但是字节索引将被提升。

否,但是字节索引将被提升。

由于java中的所有整数类型都是有符号的,因此,如果您确实希望从大于0x7F的文件中读取值,则必须屏蔽8位b的值:

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

由于java中的所有整数类型都是有符号的,只要您确实希望从大于0x7F的文件中读取值,您就必须屏蔽掉b值的8位:

byte b;
byte a[256];
a [b & 0xFF] = x;
在Java字节码级别,所有的
byte
s已经是
int
s了

无论如何,执行数组索引将自动向上转换为
int
。所有这些都不会提高性能,而且很多都会降低性能。只需使用
int
保留代码即可

:

请注意,表2.2中的大多数指令没有用于整型字节、字符和短字符的形式。没有一个具有布尔类型的窗体。编译器使用Java虚拟机指令对byte和short类型的文本值进行编码,Java虚拟机指令在编译时或运行时将这些值扩展为int类型的值。boolean和char类型的文本值的加载使用在编译时或运行时将文本零扩展为int类型的指令进行编码。类似地,使用Java虚拟机指令对来自boolean、byte、short和char类型的值数组的加载进行编码,这些指令将值扩展或零扩展为int类型的值。因此,对实际类型boolean、byte、char的值的大多数操作,通过对计算类型int的值进行操作的指令,可以正确执行和short

在Java字节码级别,所有的
byte
s已经是
int
s了

无论如何,执行数组索引将自动向上转换为
int
。所有这些都不会提高性能,而且很多都会降低性能。只需使用
int
保留代码即可

:

请注意,表2.2中的大多数指令没有用于整型字节、字符和短字符的形式。没有一个具有布尔类型的窗体。编译器使用Java虚拟机指令对byte和short类型的文本值进行编码,Java虚拟机指令在编译时或运行时将这些值扩展为int类型的值。boolean和char类型的文本值的加载使用在编译时或运行时将文本零扩展为int类型的指令进行编码。类似地,使用Java虚拟机指令对来自boolean、byte、short和char类型的值数组的加载进行编码,这些指令将值扩展或零扩展为int类型的值。因此,对实际类型boolean、byte、char的值的大多数操作,通过对计算类型int的值进行操作的指令,可以正确执行和short


不,没有性能下降,因为在读取字节的那一刻,您将其存储在一个内存中。这些寄存器总是与一起工作,这意味着字节总是“转换”为int(或long,如果您在64位机器上)

因此,只需像这样读取字节:

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

如果您的应用程序对性能至关重要,那么您应该在其他地方进行优化。

不,没有性能下降,因为在读取字节的那一刻,您就将其存储在一个内存中。这些寄存器总是与一起工作,这意味着字节总是“转换”为int(或long,如果您在64位机器上)

因此,只需像这样读取字节:

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

如果您的应用程序对性能至关重要,您应该在其他地方进行优化。

但是“数组必须通过int值进行索引;short、byte或char值也可以用作索引值,因为它们经过一元数字升级(§5.6.1)并成为int值。”@Zoe,所以它是用一个int来索引的,但我可以更清楚地说,我想你已经知道了。理解起来有点简洁。但是“数组必须用int值索引;short、byte或char值也可以用作索引值,因为它们经过一元数字提升(§5.6.1)并成为int值。”@Zoe所以它是用int索引的——但我可以更清楚地说。我想你已经做到了。只是有点简明扼要。我不能谈论性能问题。如果你想要这个,我会使用一个ByteBuffer并迭代它。ByteBuffer是非常优化的。。。你也可以直接用ByteBuffer你试过了吗?提示-如果您正在读取物理磁盘(甚至是SSD)上的文件,它会编译,然后从
byte
int
的转换与首先获取数据所需的路径相比将是完全不重要的。我不会假设有显著的性能影响,直到您测量了它,并且它给您的程序带来了问题。当性能不是问题时,担心性能会导致糟糕的设计选择。我不能谈论性能问题。如果你想要这个,我会使用一个ByteBuffer并迭代它。ByteBuffer是非常优化的。。。你也可以直接用ByteBuffer你试过了吗?提示-如果您正在读取物理磁盘(甚至是SSD)上的文件,它会编译,然后从
byte
int
的转换与首先获取数据所需的路径相比将是完全不重要的。我不会假设有显著的性能影响,直到您测量了它,并且它给您的程序带来了问题。忧虑