Ao navegar no código fonte do Guava, me deparei com o seguinte trecho de código (parte da implementação de hashCodepara a classe interna 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;
Ambos adjuste hashsão ints. Pelo que sei sobre Java, ~significa negação bit a bit, portanto, adjust = ~~adjuste hash = ~~hashdeve deixar as variáveis inalteradas. Executando o pequeno teste (com afirmações ativadas, é claro),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
confirma isso. Supondo que os caras da Goiaba saibam o que estão fazendo, deve haver uma razão para eles fazerem isso. A questão é o que?
EDITAR Como apontado nos comentários, o teste acima não inclui o caso em que ié igual Integer.MAX_VALUE. Como i <= Integer.MAX_VALUEsempre é verdade, precisaremos verificar esse caso fora do loop para impedir que ele faça loop para sempre. No entanto, a linha
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
gera o aviso do compilador "Comparando expressões idênticas", que praticamente o define.
Integer.MAX_VALUE. Contraste com -(-Integer.MIN_VALUE) != Integer.MIN_VALUE.
-Integer.MIN_VALUEenvolve Integer.MIN_VALUE, negando que novamente simplesmente produz Integer.MIN_VALUEnovamente.
-x = (~x) + 1.