是否将Byte实现为Int?

时间:2013-09-29 13:53:58

标签: java int byte

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

需要强制转换

a =(byte)(b + c);

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

我目前为我的游戏提供了一个庞大的2D数组声明为Byte,以节省空间和按位操作。它真的节省空间吗?我也看到了在Ints中对Int进行逐位运算,按位运算按位运行是否正常工作?

4 个答案:

答案 0 :(得分:6)

这通常是不正确的。事实上,JVM Specification §2.3中列出了这一点:

  

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

数值类型由整数类型(§2.3.1)和浮点类型(§2.3.2)组成。

     

整数类型是:

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

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

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

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

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

  •   

现在,对于'\u0000',它的故事略有不同。来自§2.3.4

  

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

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

int[]
ICONST_1
NEWARRAY T_BYTE
DUP
ICONST_0
BIPUSH 42
BASTORE
ASTORE 1

VS

byte[] b = {42};
ICONST_1
NEWARRAY T_INT
DUP
ICONST_0
BIPUSH 42
IASTORE
ASTORE 1

  

实际上是在节省空间吗?

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

  

在Ints上按预期进行按位操作吗?

是的,他们这样做。

答案 1 :(得分:1)

确实byte + byte = int需要强制转换,但byte s在内存中使用8位数据实现,而int s是32位。因此,使用byte s会减少阵列占用的内存量4次。

例如,如果你有一个10乘10的byte数组,它的大小将是800,但是10 x 10的int s'数组将是3200。

More information on this

答案 2 :(得分:1)

答案取决于您使用的是byte类型的单个变量,还是使用字节数组byte[]。字节数组确实节省了空间,每个Java字节仅使用一个字节的内存(加上数组对象的恒定数量的内务处理数据)。但是,类型为byte的单个局部变量实际上存储为堆栈中的int,并占用相应的4个字节的内存。这甚至在字节码中表示 - 有操作码baload - “从数组加载字节或布尔值”但是没有用于从局部变量加载字节的操作码,就像有iload用于整数。类似地,本地charboolean变量实际上作为int存储在堆栈中,并且基于int的操作码用于访问它们。

条目2.6.1 in JLS还表示所有局部变量在堆栈上占用一个或两个“槽”,因此单槽类型byte,char,float和int都占用相同的空间。 JVM无法寻址小于单个这样的插槽的单元,因此在一个字节的情况下,可以说浪费了3个字节。

要进行整理:请使用byte 数组来节省空间,但对于个别变量,请使用byte代替int的{​​{1}}不会节省空间,甚至可能会产生很小的负面性能影响(如果您需要byte语义,可能需要它,例如反包装行为等等。

答案 3 :(得分:0)

是的,当你执行一个字节加法时,返回值总是一个整数,原因是8bit + 8bit加法总是会产生一个大于8bit的值。

e.g。

十进制|二进制

255 |   1111 1111
121 |   0111 1001

376 | 1 0111 1000

因此,如果您尝试将其再次存储在一个字节中,肯定会导致数据丢失。 如果完成对字节的类型转换,那么你将得到“120”而不是376。

你绝对可以使用int而不是byte,并且位操作也可以完美地用于int。 参考:http://www.tutorialspoint.com/java/java_bitwise_operators_examples.htm