Java 为什么使用1<&书信电报;4而不是16?

Java 为什么使用1<&书信电报;4而不是16?,java,openjdk,Java,Openjdk,java.util.HashMap的OpenJDK代码包括以下行: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int DEFAULT\u INITIAL\u CAPACITY=1Writing1我看不懂开发人员的心思,但我们这样做是为了表明数字之间的关系 比较一下: int-day=86400 vs int day=60*60*24;//86400 第二个示例清楚地显示了数字

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

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

static final int DEFAULT\u INITIAL\u CAPACITY=1Writing
1我看不懂开发人员的心思,但我们这样做是为了表明数字之间的关系

比较一下:

int-day=86400

vs

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


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

我认为原因是开发人员可以非常轻松地更改值(根据JavaDoc'/*默认初始容量-必须是2的幂。*/')例如,
1显式表示它是二的幂,正如
HashMap.java
中它上面的注释所说:
/*默认初始容量-必须是二的幂*/处理位操作时,它可能很有用。更明显的是,二进制表示形式是
0b10000
,并且没有其他类似的位标志被设置?这是一种非常简单的写入位标志的方法,特别是当您使用更高的位数字时,例如,您希望写入什么,
1也经常用于指示常量是位掩码中的位。虽然这不是这里的原因,但我要补充的是,这种类型的最佳实践与生成更自我解释的代码有关,并避免进一步使用幻数()。虽然这里有一个适当名称的常量用法,但该值也更容易以这种方式显示。但为什么不以另一种方式显示呢?:
int value=16;//2^4
@li如果你愿意,你可以。这对编译器没有影响。
/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
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
        ...