是否将Byte实现为Int?

And*_*der 4 java int byte

我有一本java游戏书建议尽可能将所有数据作为Int实现,该类型运行速度最快.它说Byte,Char和Boolean都是以Int的形式实现的,所以你不需要节省空间,因为Byte数据会使代码速度降低,所以你最终不得不在代码中进行转换.例如,需要演员表

a =(字节)(b + c);

因为加法结果是一个Int,即使a,b和c都被声明为Bytes.

我目前有一个巨大的2D数组声明为我的游戏Byte,以节省空间和按位操作.它真的节省空间吗?我也看到在例子中对Ints进行按位运算,按位运算按位运行吗?

ars*_*jii 6

这通常是不正确的.实际上,JVM规范§2.3中概述了这一点:

Java虚拟机支持的原始数据类型是数字类型,boolean类型(§2.3.4)和returnAddress类型(§2.3.3).

数字类型由整数类型(§2.3.1)和浮点类型(§2.3.2)组成.

整体类型是:

  • byte,其值为8位有符号二进制补码整数,其默认值为零

  • short,其值为16位有符号二进制补码整数,其默认值为零

  • int,其值为32位有符号二进制补码整数,其默认值为零

  • long,其值为64位有符号二进制补码整数,其默认值为零

  • char,其值为16位无符号整数,表示基本多语言平面中的Unicode代码点,使用UTF-16编码,其默认值为空代码点('\u0000')

现在,因为boolean它有点不同.从§2.3.4开始:

尽管Java虚拟机定义了一种boolean类型,但它只为它提供了非常有限的支持.没有专门用于boolean值操作的Java虚拟机指令.相反,Java编程语言中对布尔值进行操作的表达式将被编译为使用Java虚拟机int数据类型的值.

您可以看到字节码的差异取决于您使用的是a byte[]还是a int[],因此它们不相同:

byte[] b = {42};
Run Code Online (Sandbox Code Playgroud)
ICONST_1
NEWARRAY T_BYTE
DUP
ICONST_0
BIPUSH 42
BASTORE
ASTORE 1

VS

int[] b = {42};
Run Code Online (Sandbox Code Playgroud)
ICONST_1
NEWARRAY T_INT
DUP
ICONST_0
BIPUSH 42
IASTORE
ASTORE 1

它真的节省空间吗?

是的,它可能是,特别是如果阵列非常大.

按位操作在Ints上按预期工作吗?

是的,他们这样做.