我在 Java 教程中读到了这一行:
byte:byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。
我不太清楚粗线。有人可以为我解释一下吗?
Byte 的(有符号)范围是 -128 到 127,而 int 的(也有符号)范围是 -2,147,483,648 到 2,147,483,647。
这意味着,由于您要使用的值将始终在该范围之间,通过使用字节类型,您告诉任何阅读您的代码的人该值将始终在 -128 到 127 之间,而无需记录关于它。
尽管如此,正确的文档始终是关键,您应该只在出于可读性目的而指定的情况下使用它,而不是作为文档的替代品。
如果您使用最大值为 127 的变量,则可以使用byte
而不是int
让其他人知道而无需阅读任何if
条件,这可能会检查边界,该变量只能具有 -128 和 127 之间的值。
所以这是一种自我记录的代码 - 正如你引用的文本中提到的那样。
就个人而言,我不推荐这种“文档”——仅仅因为一个变量只能保存最大值 127 并不能揭示它的真正目的。
我想可以byte
用于处理实际字节的任何事情。
此外,颜色的部分(红色、绿色和蓝色)通常具有 0-255 的范围(虽然byte
从技术上讲是 -128 到 127,但数量相同)。
也可能有其他用途。
我必须使用的一般反对意见byte
(可能是为什么它没有被尽可能频繁地看到)是需要大量的演员表。例如,每当您对 a byte
(except X=
) 进行算术运算时,它会自动提升为int
(even byte+byte
),因此如果要将其放回 a ,则必须将其强制转换byte
。
一个非常基本的例子:
FileInputStream::read返回一个byte
包裹在一个int
(或-1)中。可以将其转换为 anbyte
以使其更清晰。我不支持这个例子(因为我真的(此时)不明白做下面的事情的意义),只是说类似的话可能是有道理的。
它也可能首先返回一个字节(如果文件结束,可能会引发异常)。这可能更清楚,但这样做的方式确实有意义。
FileInputStream file = new FileInputStream("Somefile.txt");
int val;
while ((val = file.read()) != -1)
{
byte b = (byte)val;
// ...
}
如果您不太了解FileInputStream
,您可能不知道read
返回什么,因此您会看到 anint
并且您可能会假设有效范围是int
(-2^31 到 2^31-1) 的整个范围,或者可能是a char
(0-65535) (对于文件操作来说不是一个糟糕的假设),但随后您会看到演员byte
表并重新考虑。
如果返回类型是byte
,您将从一开始就知道有效范围。
另一个例子:
Color的构造函数之一可能已从 3 更改为 3 int
,byte
因为它们的范围限制为 0-255。
Integers
在 Java 中以 32 位存储;bytes
以 8 位存储。
假设您有一个包含一百万个条目的数组。哎呀!那是巨大的!
int[] foo = new int[1000000];
现在,对于 中的每个整数foo
,您使用32 位或4 字节的内存。总共有400 万字节,即4MB。
请记住,integer
Java 中的 an 是介于 -2,147,483,648 和 2,147,483,647 之间的整数。如果您的数组foo
只需要包含 1 到 100 之间的整数怎么办?foo
通过声明为int
数组,您没有使用很多数字。
这是byte
变得有帮助的时候。Bytes
存储 -128 和 127 之间的整数,非常适合您的需要!但为什么选择bytes
?因为它们使用了整数空间的四分之一。现在您的数组正在浪费更少的内存:
byte[] foo = new byte[1000000];
现在每个条目foo
占用8 位或1 个字节的内存,因此总共foo
只占用100 万字节或1MB的内存。
与使用相比,这是一个巨大的改进int[]
——您刚刚节省了 3MB 的内存。
显然,您不想将其用于包含超过 127 的数字的数组,因此另一种阅读您提到的粗体行的方法是,由于字节范围有限,这让开发人员知道该变量严格限制为这些界限。开发人员没有理由假设存储为字节的数字会超过 127 或小于 -128。使用适当的数据类型可以节省空间并通知其他开发人员对变量施加的限制。
这意味着知道一个值被显式声明为一个非常小的数字可能会帮助您回忆它的用途。
当您必须为代码创建文档时,请选择真正的文档,但是,依赖数据类型不是文档。
int 涵盖从 0 到 4294967295 或 2 到 32 次方的值。这是一个很大的范围,如果你的测试得分超过 100,那么如果你的所有数字都在 0 到 100 之间,那么你就是在浪费额外的空间。存储整数只需要更多的内存和硬盘空间,而且严重的是如果您不使用 int 提供的额外范围,数据驱动的应用程序就会浪费金钱。
当您想要处理来自文件或网络的流形式的数据时,通常使用字节数据类型。这背后的原因是因为网络和文件是在字节的概念上工作的。
示例: FileOutStream 始终将字节数组作为输入参数。