【问题标题】:Why does InputStream read() return an int and not a short?为什么 InputStream read() 返回一个 int 而不是一个 short?
【发布时间】:2014-01-11 13:22:22
【问题描述】:

我正在阅读byte stream 试用版并注意到以下声明

注意 read() 返回一个 int 值。如果输入是一个流 字节,为什么 read() 不返回字节值?使用 int 作为返回 type 允许 read() 使用 -1 表示已经到了结尾 流的。

使用int 的给定原因是它们可以通过-1 来识别EOF。 (看起来很浅)

所以下一个更大的原始类型是short,它也支持-1,为什么不使用它呢?

据我所知:(使用int的原因)

  1. 由于性能,int 是首选。 (this)
  2. int 变量在其最后 16 位中保存一个字符值(来自 character trial)
  3. 其他更抽象的流需要读取的不仅仅是一个 字节(我猜的东西(发生在字符流中))

我的理由正确吗?我错过了什么(比如纠错)吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    更喜欢int 而不是short 的最重要原因是short 是一种二等公民:所有整数文字以及所有算术运算都是int 类型的,所以你'我得到了short->int 的促销活动。另外,对于int 的使用,反对的争论很少或根本没有。

    【讨论】:

    • ...并且在设计 java 时标准 CPU 架构是 32 位的,所以 int (可能)是可以以最高速度使用的最大数字,所以为什么不使用它因为越大,它的寿命就越长。我严重怀疑使用 short 会节省时间或内存。
    【解决方案2】:

    只有一种情况下使用short 会给您带来优势:短的大数组。可以肯定的是,只有当要存储的数字明确符合界限时,才能使用它们。

    在所有其他情况下,您是否拥有shortint 并没有真正的区别。例如:

    class A {
        short s;
        double d;
    }
    

    使用的内存不会少于:

    class B {
        int s;
        double d;
    }
    

    因为对齐问题。因此,虽然第一个只有 10 个字节的 netto 数据,而第二个有 12 个字节,但当您分配一个对象时,它仍然会与某个 8 字节边界对齐。即使只有4字节的边界,内存使用量也是一样的。

    【讨论】:

    • +1 jls 确实建议使用 short 而不是 int 只是为了节省空间
    【解决方案3】:

    这是一个有趣的问题:-)。确实,他们必须使用有符号整数值类型来表示 EOF,但int 优于 short 可能真的只是性能。

    正如我在讨论此问题的另一个 StackOverflow 线程上发现的那样,即使定义使用了 short,Java VM 也会在内部自动使用 int

    Java 文档指出,short 应该用于大型数组和内存真正重要的情况 - 来源 - http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。这显然不是这里的情况,因为我们总是只得到一个值。

    【讨论】:

    • 但是如何强制执行short 溢出?这需要额外的操作,并免费提供 int(当然,受原生指令支持的影响,但前提是 int 更快,因为 缺乏 原生 short 支持) .
    猜你喜欢
    • 2011-06-07
    • 2013-09-23
    • 2014-03-31
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多