2017-06-08 16 views
49

Tôi biết rằng '==' không hoạt động với các giá trị nằm ngoài phạm vi [-128,127] vì có bộ nhớ cache được duy trì các đối tượng Integer trong phạm vi này và tham chiếu tương tự được trả về nếu giá trị nằm trong phạm vi. Nhưng tại sao '>', '<', '> =', '< =' trả lời đúng ngay cả ngoài phạm vi?Tại sao '<', '>' làm việc với các lớp bao bọc trong khi '==' thì không?

Integer a=150; 
Integer b=150; 
System.out.println(a==b); //returns false 

Integer a=150; 
Integer b=150; 
System.out.println(a>=b); // returns true 

Tại sao điều này lại xảy ra?

Trả lời

82

Các toán tử <, >, <=>= chỉ được xác định cho các loại nguyên thủy. Vì vậy, sử dụng chúng trên các loại trình bao bọc khiến trình biên dịch unbox các đối tượng thành các nguyên thủy.

Điều này có nghĩa

System.out.println(a>=b); 

tương đương với

System.out.println(a.intValue()>=b.intValue()); 

Tuy nhiên, ==!= khai thác tồn tại cho cả hai loại nguyên thủy và các loại tài liệu tham khảo, vì vậy việc sử dụng chúng để so sánh hai đối tượng có kiểu wrapper nguyên thủy so sánh các tham chiếu thay vì các giá trị nguyên thủy mà chúng bao bọc.

Như Holger nhận xét, so sánh các tài liệu tham khảo đối tượng với ==!= tồn tại bằng ngôn ngữ Java trước khi auto-boxing và tự động unboxing đã được giới thiệu, nhưng so sánh với <, >, <=>= đã không được hỗ trợ cho bất kỳ loại tài liệu tham khảo trước tự động mở hộp được giới thiệu.

Điều này có nghĩa là trong những ngày đầu của Java, a>=b đoạn mã của bạn sẽ không chuyển biên dịch (vì ab không phải là loại số nguyên thủy). Mặt khác, đoạn mã a==b của bạn vẫn sẽ chuyển biên dịch và trả lại false.

Thay đổi hành vi của ==!= đối với các loại tham chiếu xảy ra là trình bao bọc các số nguyên thủy sẽ thay đổi hành vi của mã hiện có, do đó phá vỡ khả năng tương thích ngược, đó có thể là lý do không được thực hiện.

+0

Cảm ơn. Tôi cho rằng đây cũng là trường hợp với các toán tử '> =' và '<='? –

+0

@GaurangSinghal yes – Eran

+6

Cần lưu ý rằng khả năng sử dụng '==' và '! =' Để so sánh các tham chiếu tồn tại trong Java trước khi giới thiệu tự động unboxing, vì vậy không thể xác định chúng để so sánh các giá trị không được hộp, vì điều đó sẽ phá vỡ tính tương thích. Nếu không có di sản đó, việc xác định toán tử khác nhau để so sánh tham chiếu sẽ có thể và giải pháp sạch nhất. Thật không may, con tàu đó đã đi thuyền… – Holger

Các vấn đề liên quan