Khi duyệt mã nguồn của Guava, tôi đã bắt gặp đoạn mã sau (một phần của việc triển khai hashCode
cho lớp bên trong 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;
Cả hai adjust
và hash
là int
s. Từ những gì tôi biết về Java, ~
có nghĩa là phủ định bitwise, vì vậy adjust = ~~adjust
và hash = ~~hash
nên để các biến không thay đổi. Chạy thử nghiệm nhỏ (dĩ nhiên đã bật xác nhận),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
xác nhận điều này. Giả sử rằng những người ổi biết họ đang làm gì, phải có lý do để họ làm điều này. Câu hỏi là gì?
EDIT Như đã chỉ ra trong các ý kiến, bài kiểm tra ở trên không bao gồm trường hợp i
bằng Integer.MAX_VALUE
. Vì i <= Integer.MAX_VALUE
luôn luôn đúng, chúng ta sẽ cần kiểm tra trường hợp đó bên ngoài vòng lặp để ngăn nó lặp lại mãi mãi. Tuy nhiên, dòng
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
đưa ra cảnh báo trình biên dịch "So sánh các biểu thức giống hệt nhau", điều này khá giống với nó.
Integer.MAX_VALUE
. Tương phản với -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
.
-Integer.MIN_VALUE
kết thúc tốt đẹp Integer.MIN_VALUE
, để phủ nhận rằng một lần nữa chỉ đơn giản là sản xuất Integer.MIN_VALUE
lại.
-x = (~x) + 1
.