【问题标题】:Why HashMap internal work helper variables are int, which can be byte datatype为什么HashMap内部工作辅助变量是int,可以是byte数据类型
【发布时间】:2012-04-11 07:59:42
【问题描述】:

HashMap 内部有自己的静态最终变量供其工作。

        static final int DEFAULT_INITIAL_CAPACITY = 16;

为什么他们不能使用byte 数据类型而不是使用int,因为值太小了。

【问题讨论】:

    标签: java variables hashmap int byte


    【解决方案1】:

    对变量和常量使用byteshort 而不是int 是一种过早的优化,几乎没有效果。

    JVM 的大多数算术和逻辑指令仅适用于 intlongfloatdouble,其他数据类型必须(通常)转换为 ints 才能使用这些指令对他们执行。

    数字文字的默认类型是 int 用于整数,double 用于浮点数。因此,使用byteshortfloat 类型会导致一些细微的编程错误,并且通常会降低代码的可读性。

    Java Puzzlers 书中的一个小例子:

    public static void main(String[] args) {
        for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++) {
            if (b == 0x90)
                System.out.print("Joy!");
        }
    }
    

    这个程序打印Joy!,因为十六进制值0x90被隐式提升为int,其值为144。由于 Java 中的bytes 是有符号的(这本身很不方便),变量b 永远不会分配给这个值(Byte.MAX_VALUE = 127),因此永远不会满足条件。

    总而言之,内存占用量的减少实在是太小了(几乎没有),不足以证明这种微优化的合理性。通常,不同大小的显式数字类型不是必需的,并且适用于更高级别的编程。我个人认为,只有字节数组才能接受较小的数值类型。

    【讨论】:

      【解决方案2】:

      byte 转换为 int(as it needs to be anint` 在任何情况下)都会使代码变慢(如果有的话)。在整体方案中,内存的成本是微不足道的。

      鉴于默认值可以是任何int 值,我认为int 是有意义的。

      【讨论】:

        【解决方案3】:

        我认为这是因为Map 的容量以int 表示。当您尝试使用byteint 时,由于提升规则,字节无论如何都会转换为int。默认容量以int 表示,以避免那些不必要的促销。

        【讨论】:

          【解决方案4】:

          字节值在 JVM 中仍然占用相同的空间,并且还需要显式或隐式地将其转换为 int 以实现实际用途,包括数组大小、索引等。

          【讨论】:

          • int 消耗 4 个字节,byte 消耗一个字节来存储它的值
          • @krishna,它依赖于 JVM,但大多数 JVM 在内部将 int、short、byte 和 boolean 存储为 32 位字,主要是为了保持字对齐。
          【解决方案5】:

          很多数据可以表示为一系列字节。

          Int 是大多数用户在计算或处理整数时使用的默认数据类型。

          使用 Byte 的问题是编译器无法识别它进行类型转换。

          任何时候都尝试过

          int variablename = bytevariable;
          

          但它不会完成任务

          double variablename = intVariable;
          

          会起作用的。

          【讨论】:

            【解决方案6】:

            他们可以,但这将是一个微优化,并且权衡会降低可读性和可维护性代码(Premature optimization,有人吗?)。

            这是一个静态最终变量,因此每个类加载器只分配一次。我想说我们可以节省这 3 个(我猜这里)字节。

            【讨论】:

            • 我个人认为这个问题不属于过早优化的范畴。关于为什么可以表示为byte 的东西被声明为int,这是一个非常有效的问题。
            • 不,这完全是过早的优化。 (此外,由于对齐限制,我什至不相信将其写为 byte 节省任何内存。)
            • @Louis Wasserman:我知道这一切,因此我的回答。我的观点是,从初学者的角度来看,如果我们只说“那是过早的优化,我们不要为此烦恼”,这对他没有帮助。另外,我不是谈论节省内存,而是使用正确的数据类型来完成这项工作。我们需要向他解释为什么 byte 没有被选中,而不仅仅是说“过早优化”并洗手。
            • 不过,我不相信这一点。 “过早的优化很糟糕”是不单独进行此更改的一个很好的理由,对于初学者来说,这是值得学习的一课。
            猜你喜欢
            • 1970-01-01
            • 2021-10-12
            • 2011-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-08
            • 2012-07-11
            • 1970-01-01
            相关资源
            最近更新 更多