Từ Java 1.5, bạn có thể trao đổi khá nhiều Integer
với int
trong nhiều trường hợp.Java: Số nguyên bằng hoặc ==
Tuy nhiên, tôi đã tìm thấy lỗi tiềm ẩn trong mã của mình khiến 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ư được thiết lập không đúng cách không phù hợp khi các giá trị là như nhau, mặc dù tôi không thể xác định trong hoàn cảnh nào. Tôi đặt một breakpoint trong Eclipse và thấy rằng các giá trị Integer
là cả 137, và tôi kiểm tra biểu thức boolean và nó nói nó là sai, nhưng khi tôi bước qua nó, nó đã thiết lập không khớp với đúng.
Thay đổi điều kiện để:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
cố định vấn đề.
Có ai có thể tiết lộ một số lý do tại sao điều này xảy ra không? Cho đến nay, tôi đã chỉ nhìn thấy hành vi trên localhost của tôi trên máy tính của riêng tôi. Trong trường hợp cụ thể này, mã đã thực hiện thành công nó qua khoảng 20 lần so sánh, nhưng thất bại trên 2. Vấn đề đã được lặp lại liên tục.
Nếu nó là một vấn đề phổ biến, nó sẽ gây ra lỗi trên môi trường khác của chúng tôi (dev và thử nghiệm), nhưng cho đến nay, không ai báo cáo vấn đề sau hàng trăm thử nghiệm thực thi đoạn mã này.
Vẫn không hợp pháp để sử dụng ==
để so sánh hai giá trị Integer
?
Ngoài tất cả các câu trả lời tốt dưới đây, liên kết xếp chồng lên nhau sau đây có khá nhiều thông tin bổ sung. Nó thực sự sẽ trả lời câu hỏi ban đầu của tôi, nhưng vì tôi không đề cập đến autoboxing trong câu hỏi của tôi, nó đã không xuất hiện trong các đề xuất đã chọn:
Why can't the compiler/JVM just make autoboxing “just work”?
Cảm ơn, điều đó chắc chắn giải thích vì sao 137 thất bại! Và nó cũng trả lời câu hỏi của tôi về lý do tại sao nó không phải là một vấn đề phổ biến, trong 95% các trường hợp tôi sẽ gặp phải, giá trị sẽ dưới 127. Tốt để bắt này ngay bây giờ mặc dù cho 5% mà nó không phải là. –
Lưu ý thú vị: cho đến một vài tuần trước, cdiCt và cdsCt là cả hai ints vì vậy điều này là tốt, nhưng tôi đã phải làm cho họ số nguyên để kiểm tra tình hình null được xử lý khác nhau ... –
@Jeremy Yeah, đó là một vấn đề khá mơ hồ, nhưng như một quy tắc chung bạn sử dụng .equals() cho các đối tượng và == cho nguyên thủy. Bạn không thể dựa vào autounboxing để kiểm tra bình đẳng. – Adam