Saat menelusuri kode sumber Guava, saya menemukan potongan kode berikut (bagian dari implementasi hashCode
untuk 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 adjust
dan hash
yang int
s. Dari apa yang saya ketahui tentang Java, ~
berarti negasi bitwise, jadi adjust = ~~adjust
dan hash = ~~hash
harus 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 i
sama dengan Integer.MAX_VALUE
. Karena i <= Integer.MAX_VALUE
selalu 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_VALUE
membungkus Integer.MIN_VALUE
, jadi meniadakan itu lagi hanya menghasilkan Integer.MIN_VALUE
lagi.
-x = (~x) + 1
.