双波浪号(~~)在Java中的含义是什么?
2022-08-31 06:27:50
在浏览Guava的源代码时,我遇到了以下代码(内部类实现的一部分):hashCode
CartesianSet
int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
adjust *= 31;
adjust = ~~adjust;
// in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
hash = 31 * hash + (size() / axis.size() * axis.hashCode());
hash = ~~hash;
}
hash += adjust;
return ~~hash;
和 都是 s。根据我对Java的了解,意味着按位否定,所以应该保持变量不变。运行小测试(当然,启用断言),adjust
hash
int
~
adjust = ~~adjust
hash = ~~hash
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
证实了这一点。假设番石榴家伙知道他们在做什么,那么他们这样做一定有一个理由。问题是什么?
编辑正如注释中指出的那样,上面的测试不包括等于 的情况。由于 始终为 true,因此我们需要在循环外部检查该情况,以防止其永远循环。但是,该行i
Integer.MAX_VALUE
i <= Integer.MAX_VALUE
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
产生编译器警告“比较相同的表达式”,这几乎钉死了它。