我需要迭代所有字节值(-128到127,包括端值)。我可以使用int
迭代器,但我必须每次都转换为byte
。使用byte
迭代器有一个问题,我无法测试b < 128
,因为它会溢出。我想过使用while循环并在递增之前进行测试,这是我迄今为止最好的解决方案。有更好的方法吗?
答案 0 :(得分:10)
Java字节已签名,因此它们的值为-128到127.无论如何,您不应该担心类似的强制转换和额外检查,因为它们很容易进行优化。实际上,在JVM级别,没有字节变量这样的东西。无论如何,它被视为一个int。
答案 1 :(得分:3)
使用字节迭代器有一个问题,我无法测试b&lt; 128
测试b == 127
作为循环终止条件。
但是,我同意锑的观点,从性能角度来看,使用int
或byte
可能没什么区别。在字节码级别,JVM仅提供32位和64位整数算术运算符。
在语言层面,我认为类型转换将在byte
案例以及int
案例中发生。考虑b++
实际上等同于
byte b = ...;
b = (byte) (b + 1);
并且类型转换不是noop,因为b + 1
产生int
值。所以
for (byte b = -128; b != 127; b++) {
...
}
有一个名义上的类型。从性能角度来看这是否意味着什么是值得商榷的,因为JIT在生成本机代码时会做很多工作来优化不必要的操作。
最后,有关Java中微优化的标准要点: