Java中字节类型的用途

Hải*_*ong 6 java primitive byte

我在Java教程中读到了这一行:

byte:字节数据类型是8位有符号二进制补码整数.它的最小值为-128,最大值为127(含).字节数据类型可用于在大型阵列中保存内存,其中节省的内存实际上很重要.它们也可用于代替int,其限制有助于澄清您的代码; 变量范围有限的事实可以作为一种文档形式.

我不清楚这条粗线.有人可以帮我解释一下吗?

ale*_*oze 7

如果您使用的是一个最大值为127的变量,您可以使用byte而不是int其他人知道,而不会读取任何if条件,这可能会检查边界,该变量只能具有介于-128和127之间的值.

所以它是一种自我记录的代码 - 正如你引用的文本中所提到的那样.

就个人而言,我不推荐这种"文档" - 只是因为变量只能保持最大值127并不能揭示它的真正目的.


Duk*_*ing 6

我想它可以用于byte任何处理实际字节的东西。

此外,颜色的组成部分(红色、绿色和蓝色)通常具有 0-255 的范围(虽然byte从技术上讲是 -128 到 127,但数字数量相同)。

还可能有其他用途。

我必须使用的普遍反对意见byte(可能也是为什么它不经常被看到的原因)是需要大量的选角。例如,每当您对 a byte(除了X=) 进行算术运算时,它都会自动提升为int(even byte+byte),因此如果您想将其放回 a 中,则必须对其进行强制转换byte

一个非常基本的例子:

FileInputStream::read返回一个byte包裹在 an int(或 -1)中的值。可以将其转换为 anbyte使其更清晰。我不支持这个例子(因为我(此时)真的不明白做下面的事情的意义),只是说类似的事情可能是有意义的。

它也可能首先返回一个字节(如果文件结束,则可能抛出异常)。这可能更清楚,但这样做的方式确实有意义。

FileInputStream file = new FileInputStream("Somefile.txt");
int val;
while ((val = file.read()) != -1)
{
  byte b = (byte)val;
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您对 不太了解FileInputStream,您可能不知道read返回什么,因此您看到 anint并且您可能会假设有效范围是int(-2^31 到 2^31-1) 的整个范围,或者可能是a char(0-65535)(对于文件操作来说,这是一个不错的假设),但是当您看到转换为 时byte,您会再考虑一下。

如果返回类型是byte,您从一开始就知道有效范围。

另一个例子:

Color的构造函数之一可以从 3 更改int为 3 byte,因为它们的范围限制为 0-255。


Mr.*_*obo 5

Byte的(有符号)范围为-128至127,而int的(也有符号)范围为?2,147,483,648至2,147,483,647。

这意味着由于要使用的值始终在该范围内,因此通过使用字节类型,您可以告诉任何阅读您的代码的人,该值始终在-128至127之间,而无需记录关于它。

尽管如此,正确的文档始终是关键,并且您仅应在出于可读性目的指定的情况下使用它,而不是代替文档。


Buc*_*ket 5

Integers在 Java 中以 32 位存储;bytes以 8 位存储。

假设您有一个包含一百万个条目的数组。哎呀!那是巨大的!

int[] foo = new int[1000000];
Run Code Online (Sandbox Code Playgroud)

现在,对于 中的每个整数foo,您使用32 位4 字节的内存。总共有400 万字节,即4MB

请记住,integerJava 中的an是介于 -2,147,483,648 和 2,147,483,647 之间的整数。如果您的数组foo只需要包含介于 1 和 100 之间的整数怎么办?通过声明fooint数组,您没有使用大量数字。

这就是byte有用的时候。Bytes存储 -128 和 127 之间的整数,非常适合您的需要!但为什么选择bytes因为它们使用了整数空间的四分之一。现在您的阵列浪费的内存更少:

byte[] foo = new byte[1000000];
Run Code Online (Sandbox Code Playgroud)

现在每个条目都foo占用了8 位1 个字节的内存,因此总共foo只占用100 万个字节1MB的内存。

与使用相比,这是一个巨大的改进int[]- 您只节省了 3MB 的内存。

显然,您不希望将它用于包含超过 127 的数字的数组,因此读取您提到的粗线的另一种方法是,由于字节范围有限,这让开发人员知道该变量严格限于这些界限。开发人员没有理由假设存储为字节的数字会超过 127 或小于 -128。使用适当的数据类型可以节省空间并告知其他开发人员对变量施加的限制。