使用按位运算或数字文字初始化值是否更快?

Dhr*_*Pal 1 java hashmap bit-shift bitwise-operators

我正在浏览源代码HashMap.我看到了一些 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16.我想知道为什么他们使用移位操作符的东西.这会加快计算速度吗?所以我寻找byte这三个操作之间的差异:

int DEFAULT_INITIAL_CAPACITY =  0x10;
L0
    LINENUMBER 52 L0
    BIPUSH 16
    ISTORE 1



int DEFAULT_INITIAL_CAPACITY1 =  1 << 4;
  L1
    LINENUMBER 54 L1
    BIPUSH 16
    ISTORE 2

int test = 16;
 L2
    LINENUMBER 56 L2
    BIPUSH 16
    ISTORE 3
Run Code Online (Sandbox Code Playgroud)

这个值如何初始化是否重要?

Mar*_*nik 7

信不信由你,它实际上是关于可读性.表达式1 << 4肯定不会比表达式更快地评估16.另外,无论表达式是什么,它都在编译时进行评估.

使用移位表示的关键是它是表达圆二进制数的更自然的方式.初始容量的不变量以及哈希表实现中的许多其他东西,它必须是纯粹的2的幂.这与表达式1 << n(相当于2 n)比十进制表示更直接地传达,特别是当您进入更高的值n(例如,高于16的任何值)时.


And*_*nin 5

如您自己所知,字节码对于常量16或1 << 4是相同的。在这种特殊情况下,我认为这只是可读性问题:强调初始容量应为2的幂(将1转换为左边您只能获得2的幂。这是我在HashMap的资源中所拥有的:

/**
 * 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)