为什么用1 << 4而不是16?

Kou*_*chi 10 java openjdk

OpenJDK代码java.util.HashMap包括以下行:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
Run Code Online (Sandbox Code Playgroud)

为什么1 << 4在这里使用,而不是16?我很好奇.

Boa*_*ann 22

需要强调的是,这个数字是2的幂,而不是完全随意的选择.因此,它推动开发人员尝试使用不同的数字将其更改为模式中的其他数字(例如,1 << 3或者1 << 5,而不是20),这样他们就不会破坏代码.有评论略高于:

/**
 * 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.util.HashMap都是2的幂.它是这样设计的,因为它允许使用快速按位AND操作将每个键的哈希码包装到表的容量范围内,正如您在访问表的方法中所看到:

final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (first = tab[(n - 1) & hash]) != null) { /// <-- bitwise 'AND' here
        ...
Run Code Online (Sandbox Code Playgroud)

  • 我会补充说,这种最佳做法与生成更自解释的代码有关,并且避免更多地使用幻数(http://stackoverflow.com/questions/47882/what-is-a-magic-数字和为什么不好)。虽然这里经常使用适当的名称,但该值也可以通过这种方式显示出来。 (2认同)

Sta*_*wed 10

我无法读懂开发人员的想法,但我们会这样做以表明数字之间的关系.

比较一下:

int day = 86400;

VS

int day = 60 * 60 * 24; // 86400

第二个例子清楚地显示了数字之间的关系,而Java足够聪明,可以将其编译为常量.