Java 为什么InputStream read()返回int而不是short?

Java 为什么InputStream read()返回int而不是short?,java,Java,我正在读审判书,注意到以下陈述 请注意,read()返回一个int值。如果输入是一个数据流 字节,为什么read()不返回字节值?使用int作为返回 类型允许read()使用-1表示它已到达末尾 小溪的尽头 使用int的原因是它们可以通过-1识别EOF。(似乎肤浅) 下一个较大的原语类型是short,它还支持-1,为什么不使用它呢 根据我收集的信息:(使用int的原因) 由于性能原因,首选int。 int变量在其最后16位(从 ) 其他更抽象的流将需要读取不止一个 字节(我猜是字符流中发生的)

我正在读审判书,注意到以下陈述

请注意,read()返回一个int值。如果输入是一个数据流 字节,为什么read()不返回字节值?使用int作为返回 类型允许read()使用-1表示它已到达末尾 小溪的尽头

使用
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
    over
    int
    来节省空间