En parcourant le code source de Guava, je suis tombé sur le morceau de code suivant (faisant partie de l'implémentation de hashCode
pour la classe interne 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;
Les deux adjust
et hash
sont l' int
art. D'après ce que je sais sur Java, ~
signifie négation au niveau du bit, donc adjust = ~~adjust
et hash = ~~hash
devrait laisser les variables inchangées. Lancer le petit test (avec les assertions activées, bien sûr),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
le confirme. En supposant que les gars de Guava savent ce qu'ils font, il doit y avoir une raison pour eux de le faire. La question est quoi?
EDIT Comme indiqué dans les commentaires, le test ci-dessus n'inclut pas le cas où i
est égal Integer.MAX_VALUE
. Comme i <= Integer.MAX_VALUE
c'est toujours vrai, nous devrons vérifier ce cas en dehors de la boucle pour l'empêcher de boucler pour toujours. Cependant, la ligne
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
renvoie l'avertissement du compilateur "Comparaison d'expressions identiques", ce qui résout le problème.
Integer.MAX_VALUE
. Contraste avec -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
.
-Integer.MIN_VALUE
s'enroule autour de Integer.MIN_VALUE
, donc nier que de nouveau produit simplement à Integer.MIN_VALUE
nouveau.
-x = (~x) + 1
.