为变量设置值时为什么要使用位移?

时间:2014-02-07 21:05:57

标签: java hashmap

我将通过Java中的HashMap类的源代码,并发现变量初始化为

static final int MAXIMUM_CAPACITY = 1 << 30;

为什么不只是

static final int MAXIMUM_CAPACITY = 1073741824;

这意味着同样的事情。有任何表演原因还是仅仅是一种奇特的东西?

3 个答案:

答案 0 :(得分:11)

如果您正在使用位数,1 << 30使其比1073741824更明确。

应该没有任何性能差异,因为任何合理的编译器都应该在编译时评估表达式。关于它的一切都是不变的,所以没有理由不这样做。

它还可以更容易地发现拼写错误;写1 << 31 << 20,如果你知道它应该是十亿的数量,这个错误对任何熟悉二进制文件的人都是显而易见的;写107377418241073714824而不是1073741824,错误就不那么明显了。

基本上,它归结为是一个偏好的问题,在某些情况下(例如位掩码)易于阅读。

答案 1 :(得分:3)

这里没有性能影响,因为编译器会进行所有计算。它完成的唯一原因是可读性:很容易看出1 << 30是30的幂的两个;不是每个人都可以通过查看相同数字1073741824的小数表示来得出相同的结论。

请注意,十六进制文字也可以:

0x40000000 // same as 1 << 30

通常,每当处理位模式时,将它们显示为移位和OR的组合(十六进制或八进制文字)会更方便,因为这些文字与二进制表示紧密对齐。在头脑中将它们转换为二进制文件要容易得多,因为你需要一次处理一个数字。

答案 2 :(得分:0)

没有。与1,073,741,824(这似乎是一些随机数)相比,它的编写方式更容易阅读和理解。

数字1&lt;&lt;选择30是因为hashCode()返回一个int。