Am I wrong in assuming it should be faster and more efficient? I’d hate to go through and change everything in a massive program to find out I wasted my time.
简短的答案
是的,你错了。在大多数情况下,它在使用的空间方面没有什么区别。
不值得尝试优化这个…除非你有明确的证据表明需要优化。如果你确实需要优化对象字段的内存使用,你可能需要采取其他(更有效)的措施。
更长的答案
Java虚拟机使用偏移量(实际上是32位原始单元大小的倍数)来模型堆栈和对象字段。所以当你声明一个局部变量或对象字段为(比方说)一个字节时,变量/字段将被存储在一个32位的单元格,就像一个int。
这里有两个例外:
> long和double值需要2个原始32位单元格
>原始类型数组以打包形式表示,因此(例如)一个字节数组每32位字保存4个字节。
所以它可能值得优化使用long和double …和大型数组的基元。但一般没有。
在理论上,JIT可能能够优化这一点,但在实践中我从来没有听说过JIT。一个障碍是JIT通常不能运行,直到已经创建了被编译的类的实例。如果JIT优化了内存布局,你可能有两个(或更多)同类对象的“风味”,这将带来巨大的困难。
再访
看看@ meriton的答案中的基准测试结果,似乎使用short和byte而不是int会对乘法造成性能损失。事实上,如果你孤立地考虑运作,惩罚是重要的。 (你不应该…但这是另一回事)。
我认为解释是JIT可能在每种情况下使用32位乘法指令进行乘法。但是在字节和短的情况下,它执行额外的指令以在每个循环迭代中将中间32位值转换为字节或短。 (理论上,转换可以在循环结束时进行一次…但我怀疑优化器能够找出这一点。)
无论如何,这指向另一个问题,切换到短和字节作为优化。它可以使性能更糟糕…在算法和算法密集型算法。