使用位移表示法定义Java常量

Kon*_*Kon 5 java constants bit-shift jls

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

/**
 * 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);
}
Run Code Online (Sandbox Code Playgroud)

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

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
Run Code Online (Sandbox Code Playgroud)

我从未见过我使用过的任何产品中使用的这种类型的构造,并且在Java语言规范或谷歌搜索中找不到任何结果.所以我查看了字节代码,但我发现使用16vs 1 << 4提供了相同的输出,这意味着(至少在我的极简主义情况下)编译器会将后者转换为十进制表示法.两个版本的字节码包括以下定义:

javap -c -verbose /---/myClass.class
----
public static final int i;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 16
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*man 3

它是完全等价的,但这样编写是为了更清楚地显示值的来源和计算方式——在本例中,它的预期值为 2^4。

无论哪种方式都可以编写,作者只是认为这会更加自我记录。