Java 为什么InputStream read()返回int而不是short?
我正在读审判书,注意到以下陈述 请注意,read()返回一个int值。如果输入是一个数据流 字节,为什么read()不返回字节值?使用int作为返回 类型允许read()使用-1表示它已到达末尾 小溪的尽头 使用Java 为什么InputStream read()返回int而不是short?,java,Java,我正在读审判书,注意到以下陈述 请注意,read()返回一个int值。如果输入是一个数据流 字节,为什么read()不返回字节值?使用int作为返回 类型允许read()使用-1表示它已到达末尾 小溪的尽头 使用int的原因是它们可以通过-1识别EOF。(似乎肤浅) 下一个较大的原语类型是short,它还支持-1,为什么不使用它呢 根据我收集的信息:(使用int的原因) 由于性能原因,首选int。 int变量在其最后16位(从 ) 其他更抽象的流将需要读取不止一个 字节(我猜是字符流中发生的)
int
的原因是它们可以通过-1识别EOF。(似乎肤浅)
下一个较大的原语类型是short
,它还支持-1,为什么不使用它呢
根据我收集的信息:(使用int
的原因)
int
。
int
变量在其最后16位(从
)我的理由正确吗?我是否遗漏了什么(如错误更正)?这是一个有趣的问题:-)。的确,他们必须使用有符号整数值类型来表示EOF,但是
int
优于short
可能只是性能问题
正如我在讨论这个问题的另一个StackOverflow线程中发现的那样,Java虚拟机将在内部自动使用int
,即使定义使用short
Java文档指出,在大型阵列和内存非常重要的情况下(源代码)。这里的情况显然不是这样,因为我们总是只得到一个值。与
short
相比,更喜欢int
的最重要原因是short
是一种二等公民:所有整数文本,以及所有算术运算,是int
,所以你的short
->int
促销活动到处都在进行。另外,很少有人反对使用int
只有一种情况下使用short
会给你带来优势:大量的short数组。可以肯定的是,只有在明确要存储的数字符合边界时,才能使用它们
在所有其他情况下,无论是short
还是int
,都没有真正的区别。例如:
class A {
short s;
double d;
}
使用的内存不会少于:
class B {
int s;
double d;
}
因为对齐问题。因此,虽然第一个对象只有10字节的netto数据,而第二个对象只有12字节,但当您分配一个对象时,它仍然会与一些8字节的边界对齐。即使它只是一个4字节的边界,内存使用量也将是相同的。但是如何强制执行
short
溢出呢?这需要额外的操作,并且免费提供int
(当然,这取决于本机指令支持,但前提是int
更快,因为缺乏本机short
支持)…而java设计时的标准CPU体系结构是32位的,因此int
可能是最大的数字可以在最高速度下使用,所以为什么不使用它,因为它越大,寿命越长。我严重怀疑使用short
会节省时间或内存。+1 jls确实建议使用short
overint
来节省空间