int x = 10; int y = (x.hashcode() & 0xfffffff);
以上代码如何始终使y
正面?谢谢!
答案 0 :(得分:10)
x.hashcode() & 0xfffffff
会关闭标志位。此处未使用Math.abs
,因为如果x.hashCode
等于Integer.MIN_VALUE
,它会返回负数,这会使hashtable's
数组抛出一个ArrayOutOfBoundException
而不是有趣。< / p>
来自@JonSkeet评论:它不仅会关闭符号位,还会清除接下来的三位。
但是使用哈希码我们一直处理冲突,所以它被认为是好的。
答案 1 :(得分:3)
jl
将执行按位与比较。这意味着它将使用第一个数字(在您的情况下为哈希码)和第二个数字(在您的情况下为id || name || age
1 || A || 22
2 || B || 32
3 || C || 29
4 || D || 24
)中的位,并将它们进行比较。如果两个比较位都设置为&
,则结果将为1,否则将为0xFFFFFFF
。
举一个简短的例子:如果我们在1
和0
之间进行比较,结果将是1011
,因为两个数字的左位均为1100
。回到1000
,此数字的二进制表示形式仅由28位组成。像散列函数返回的整数一样,由32位组成。
如果您现在执行按位与比较,则左4位将被忽略,因为1
缺少前4位,因此它们填充了零,并且比较的结果将为0xFFFFFFF
。其余部分保持不变,因为第二个数字中总是有一个。第一位用于指示数字是正数还是负数,并且该值丢失。因此将其设置为0xFFFFFFF
,因此整数为正。
这里的缺点是以下三位也丢失了。如果要保留它们,则必须将第一个数字设置为0
,将其余数字设置为0
,因此,您可以使用0
来代替1
。>