Câu trả lời ngắn gọn
Điểm mấu chốt là:
==
giữa hai loại tham chiếu luôn là so sánh tham chiếu
- Thường xuyên hơn không, ví dụ như với
Integer
và String
, bạn muốn sử dụng equals
thay vì
==
giữa kiểu tham chiếu và kiểu nguyên thủy số luôn là so sánh số
- Loại tham chiếu sẽ phải chịu chuyển đổi mở hộp
- Unboxing
null
luôn némNullPointerException
- Mặc dù Java có nhiều cách xử lý đặc biệt
String
, nhưng trên thực tế nó KHÔNG phải là một kiểu nguyên thủy
Các câu lệnh trên phù hợp với mọi mã Java hợp lệ nhất định . Với sự hiểu biết này, không có bất kỳ sự mâu thuẫn nào trong đoạn trích bạn đã trình bày.
Câu trả lời dài
Dưới đây là các phần JLS có liên quan:
Nếu các toán hạng của một toán tử bình đẳng là cả hai kiểu tham chiếu hoặc kiểu null , thì thao tác này là bình đẳng đối tượng.
Điều này giải thích những điều sau:
Integer i = null;
String str = null;
if (i == null) {
}
if (str == null) {
}
if (str == "0") {
}
Cả hai toán hạng đều là kiểu tham chiếu, và đó là lý do tại sao ==
so sánh bình đẳng tham chiếu là.
Điều này cũng giải thích những điều sau:
System.out.println(new Integer(0) == new Integer(0));
System.out.println("X" == "x".toUpperCase());
Để ==
trở thành bình đẳng số, ít nhất một trong các toán hạng phải là kiểu số :
Nếu các toán hạng của toán tử bình đẳng đều thuộc kiểu số hoặc một thuộc kiểu số và toán hạng kia có thể chuyển đổi thành kiểu số, thì việc thăng hạng số nhị phân được thực hiện trên các toán hạng. Nếu kiểu thăng hạng của các toán hạng là int
hoặc long
, thì một phép thử bình đẳng số nguyên được thực hiện; nếu kiểu được thăng hạng là float or
double`, thì kiểm tra bằng dấu phẩy động sẽ được thực hiện.
Lưu ý rằng quảng cáo số nhị phân thực hiện chuyển đổi tập hợp giá trị và chuyển đổi mở hộp.
Điều này giải thích:
Integer i = null;
if (i == 0) {
}
Đây là một đoạn trích từ Phiên bản Java thứ 2 hiệu quả, Mục 49: Ưu tiên các nguyên thủy hơn so với các nguyên thủy đóng hộp :
Tóm lại, sử dụng nguyên thủy ưu tiên hơn nguyên thủy đóng hộp bất cứ khi nào bạn có lựa chọn. Các loại nguyên thủy đơn giản hơn và nhanh hơn. Nếu bạn phải sử dụng nguyên liệu đóng hộp, hãy cẩn thận! Tính năng tự động đóng hộp làm giảm tính dài dòng, nhưng không nguy hiểm, của việc sử dụng các nguyên mẫu đóng hộp. Khi chương trình của bạn so sánh hai nguyên thủy đóng hộp với ==
toán tử, nó thực hiện một so sánh danh tính, điều này gần như chắc chắn không phải là điều bạn muốn. Khi chương trình của bạn thực hiện các phép tính kiểu hỗn hợp liên quan đến các nguyên thủy được đóng hộp và không được đóng hộp, nó sẽ thực hiện việc mở hộp và khi chương trình của bạn thực hiện việc mở hộp, nó có thể ném NullPointerException
. Cuối cùng, khi chương trình của bạn đóng hộp các giá trị nguyên thủy, nó có thể dẫn đến việc tạo đối tượng tốn kém và không cần thiết.
Có những nơi bạn không có lựa chọn nào khác ngoài việc sử dụng nguyên liệu đóng hộp, ví dụ như thuốc chung, nhưng nếu không, bạn nên nghiêm túc xem xét nếu quyết định sử dụng nguyên liệu đóng hộp là chính đáng.
Người giới thiệu
Câu hỏi liên quan
Câu hỏi liên quan