Tính đến Java 1.5, bạn có thể trao đổi khá nhiều Integer
với int
trong nhiều tình huống.
Tuy nhiên, tôi đã tìm thấy một khiếm khuyết tiềm năng trong mã của tôi làm tôi ngạc nhiên một chút.
Các mã sau đây:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
dường như không chính xác khi đặt không khớp khi các giá trị bằng nhau, mặc dù tôi không thể xác định trong hoàn cảnh nào. Tôi đã đặt một điểm dừng trong Eclipse và thấy rằng các Integer
giá trị đều là 137 và tôi đã kiểm tra biểu thức boolean và nó nói nó sai, nhưng khi tôi bước qua nó, nó đã đặt không khớp thành đúng.
Thay đổi điều kiện thành:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
đã khắc phục sự cố.
Bất cứ ai có thể làm sáng tỏ tại sao điều này xảy ra? Cho đến nay, tôi chỉ thấy hành vi trên localhost của tôi trên PC của riêng tôi. Trong trường hợp cụ thể này, mã đã thành công vượt qua khoảng 20 so sánh, nhưng không thành công trên 2. Vấn đề là có thể lặp lại một cách nhất quán.
Nếu đó là một vấn đề phổ biến, thì nó sẽ gây ra lỗi trên các môi trường khác của chúng tôi (dev và test), nhưng cho đến nay, không ai báo cáo vấn đề này sau hàng trăm thử nghiệm thực thi đoạn mã này.
Nó vẫn không hợp pháp để sử dụng ==
để so sánh hai Integer
giá trị?
Ngoài tất cả các câu trả lời hay dưới đây, liên kết stackoverflow sau đây có khá nhiều thông tin bổ sung. Nó thực sự đã trả lời câu hỏi ban đầu của tôi, nhưng vì tôi không đề cập đến hộp thư tự động trong câu hỏi của mình, nên nó không hiển thị trong các đề xuất được chọn:
Tại sao trình biên dịch / JVM không thể tạo autoboxing chỉ hoạt động?