Wenn Sie den Quellcode von Guava Surfen, stieß ich auf das folgende Stück Code (Teil der Umsetzung von hashCode
für die innere Klasse CartesianSet
):Was bedeutet doppelte Tilde (~~) in Java?
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;
Beide adjust
und hash
sind int
s. Von dem, was ich über Java weiß, bedeutet ~
bitweises Negieren, also sollten adjust = ~~adjust
und die Variablen unverändert lassen. Das Ausführen des kleinen Tests (mit natürlich aktivierten Zusicherungen),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
bestätigt dies. Unter der Annahme, dass die Guava-Jungs wissen, was sie tun, muss es einen Grund für sie geben, dies zu tun. Die Frage ist was?
EDIT Wie in den Kommentaren darauf hingewiesen, wird der Test über den Fall nicht enthalten, in dem i
Integer.MAX_VALUE
entspricht. Da i <= Integer.MAX_VALUE
immer wahr ist, müssen wir diesen Fall außerhalb der Schleife überprüfen, um zu verhindern, dass er für immer durchläuft. Die Zeile
ergibt jedoch die Compiler-Warnung "Vergleichen identischer Ausdrücke", die es ziemlich nagt.
@dr_andonuts Guava ist eine hübsche Standard-Bibliothek, die heutzutage in ein Projekt aufgenommen wird - ich denke, der Rat, weit weg zu rennen, ist fehl am Platz. – yshavit
Die Assert prüft nicht den Kantenfall 'Integer.MAX_VALUE'. Kontrast mit '- (- Integer.MIN_VALUE)! = Integer.MIN_VALUE'. – Franky
@Franky Sie haben Recht mit dem fehlenden Testfall, aber falsch mit dem anderen Teil wie für jeden 'int', beide' - (- x) 'und' ~ (~ x) 'gleich' x', egal was . – maaartinus