【问题标题】:Defining Java Constants using Bit-Shift Notation使用位移位表示法定义 Java 常量
【发布时间】:2015-01-04 01:36:41
【问题描述】:

我正在浏览java.util.HashMap 类的源代码,并注意到显式无参数构造函数需要两个常量:

/**
 * Constructs an empty <tt>HashMap</tt> with the default initial capacity
 * (16) and the default load factor (0.75).
 */
public HashMap() {
    this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}

但是当我查看DEFAULT_INITIAL_CAPACITY这个常量时,发现它的定义如下:

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

我从未在我从事过的任何产品中看到这种类型的构造,并且在Java Language Specification 或谷歌搜索中找不到任何结果。所以我查看了字节码,但我发现使用161 &lt;&lt; 4 提供了相同的输出,这意味着(至少在我的极简情况下)编译器会将后者转换为十进制表示法。两个版本的字节码都包含定义:

javap -c -verbose /---/myClass.class
----
public static final int i;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 16

所以我欢迎任何关于这个成语的必要性/使用的反馈。

【问题讨论】:

    标签: java constants bit-shift jls


    【解决方案1】:

    它是完全等价的,但它是这样写的,以便更清楚地知道值的来源和计算方式——在这种情况下,它的目的是 2^4。

    它可以用任何一种方式编写,作者只是认为这样会更自我记录。

    【讨论】:

      【解决方案2】:

      必要性很简单:左移 1 生成的常数,例如 1 &lt;&lt; N 将始终是 2 的幂。

      这在定义掩码时很有用,或者在 HashMap 情况下,当分配一定数量的对象时(通过缓存和类似的低级问题),2 的幂是更好的可优化值。

      只是为了清除一件事,你说:

      意味着(至少在我的极简情况下)编译器会将后者转换为十进制表示法

      事实并非如此,重要的是存储的值,它本身没有符号。 161&lt;&lt;4 具有相同的语义值,它们在文本中的表示方式与它无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        相关资源
        最近更新 更多