Vì vậy, tôi đã nghe nói rằng nếu tôi so sánh 2 chuỗi với == thì tôi sẽ chỉ nhận được đúng trở lại nếu cả hai đều tham chiếu đến cùng một đối tượng/thể hiện. Đó là dây. Điều gì về Booleans?Không == kiểm tra tính bình đẳng hoàn toàn trong Booleans? - Java
Trả lời
Có == kiểm tra tính bình đẳng hoàn toàn trong Booleans không? - Java
Nó phụ thuộc vào việc bạn đang nói về Boolean
s (đối tượng wrapper, lưu ý vốn B
) hoặc boolean
s (nguyên thủy, lưu ý các trường hợp thấp hơn b
). Nếu bạn đang nói về Boolean
s (trình bao bọc đối tượng), giống như tất cả các đối tượng, hãy kiểm tra để biết danh tính, chứ không phải tương đương. Nếu bạn đang nói về boolean
s (nguyên thủy), nó sẽ kiểm tra tính tương đương.
Vì vậy:
Boolean a, b;
a = new Boolean(false);
b = new Boolean(false);
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance
Nhưng
boolean c, d;
c = false;
d = false;
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value
chuỗi Về:
Tôi đã nghe nói rằng nếu tôi so sánh 2 chuỗi với == sau đó tôi sẽ chỉ lấy lại true nếu các chuỗi giống hệt nhau và cả hai đều tham chiếu đến cùng một đối tượng/cá thể ...
Nó không thực sự là một "và": ==
sẽ chỉ kiểm tra xem hai String
biến tham khảo với cùng String
dụ. Tất nhiên, một cá thể String
chỉ có thể có một tập hợp nội dung, vì vậy nếu cả hai biến trỏ đến cùng một trường hợp, tự nhiên nội dung giống nhau ... :-) Điểm chính là ==
sẽ báo cáo false
cho khác nhauString
các trường hợp ngay cả khi chúng có cùng các ký tự trong cùng một thứ tự. Đó là lý do chúng tôi sử dụng equals
trên chúng, chứ không phải ==
. Các chuỗi có thể gây nhầm lẫn một chút vì intern
ing, cụ thể cho các chuỗi (không có giá trị tương đương cho Boolean
, mặc dù khi bạn sử dụng Boolean.valueOf(boolean)
, bạn sẽ nhận được một đối tượng được lưu trong bộ nhớ cache). Cũng lưu ý rằng Java không có các chuỗi nguyên thủy như nó nguyên thủy boolean
, int
vv
Vì vậy, nếu tôi sử dụng 'boolean' mới để tạo biến của tôi, trái ngược với' new Boolean', '==' sẽ giống như 'equals()'? – Bluefire
@Bluefire: Bạn không sử dụng 'boolean' mới (chữ thường). Bạn sử dụng 'true' hoặc' false' hoặc kết quả của phép toán so sánh. Tôi nghĩ rằng có rất ít trường hợp sử dụng trong Java hiện đại cho 'Boolean'. –
Vì vậy, để khai báo một boolean nguyên thủy, tôi có đặt một cái gì đó như 'boolean myBoolean = true'? – Bluefire
Nó phụ thuộc nếu bạn đang nói về kiểu giá trị như: int
, boolean
, long
hoặc về các loại tài liệu tham khảo: Integer
, Boolean
, Long
. các loại giá trị có thể được so sánh với ==
, các loại tham chiếu phải được so sánh với equals
.
Nếu bạn có một đối tượng sử dụng bằng, khi không bạn có thể chạy trong những thứ như thế này. (VM bộ nhớ cache cho autoboxing nguyên thủy)
public static void main(String[] args){
Boolean a = true;
Boolean b = true;
System.out.println(a == b);
a = new Boolean(true);
b = new Boolean(true);
System.out.println(a == b);
}
đầu ra là TRUE và FALSE
điều này không cải thiện câu trả lời, vui lòng chỉ thêm câu trả lời nếu nó cải thiện các câu trả lời đã gửi –
Thực ra, câu trả lời gốc thiếu ví dụ autoboxing. Tôi đi qua đoạn mã sau: Tùy chọn
Làm thế nào các dây có thể tham khảo các ví dụ tương tự và không được giống hệt nhau? – Pablo
Không, ý tôi là nếu chúng giống nhau nhưng * không * tham chiếu đến cùng một thể hiện, == trả về false. – Bluefire
Vui lòng đọc bất cứ điều gì trước khi đăng, và không bắt đầu với tôi nghe một cái gì đó ở đâu đó. – stanwise