【发布时间】: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 或谷歌搜索中找不到任何结果。所以我查看了字节码,但我发现使用16 与1 << 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