Saat menelusuri kode sumber Guava, saya menemukan potongan kode berikut (bagian dari implementasi hashCodeuntuk kelas batin 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;
Kedua adjustdan hashyang ints. Dari apa yang saya ketahui tentang Java, ~berarti negasi bitwise, jadi adjust = ~~adjustdan hash = ~~hashharus membiarkan variabel tidak berubah. Menjalankan tes kecil (dengan pernyataan diaktifkan, tentu saja),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
mengkonfirmasi ini. Dengan asumsi bahwa para pria jambu biji tahu apa yang mereka lakukan, pasti ada alasan bagi mereka untuk melakukan ini. Pertanyaannya adalah apa?
EDIT Seperti yang ditunjukkan dalam komentar, tes di atas tidak termasuk kasus di mana isama dengan Integer.MAX_VALUE. Karena i <= Integer.MAX_VALUEselalu benar, kita perlu memeriksa kasing di luar loop untuk mencegahnya berulang selamanya. Namun, garisnya
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
menghasilkan peringatan kompiler "Membandingkan ekspresi identik", yang cukup banyak berhasil.
Integer.MAX_VALUE. Berbeda dengan -(-Integer.MIN_VALUE) != Integer.MIN_VALUE.
-Integer.MIN_VALUEmembungkus Integer.MIN_VALUE, jadi meniadakan itu lagi hanya menghasilkan Integer.MIN_VALUElagi.
-x = (~x) + 1.