2012-06-17 33 views
20

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

+4

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

+0

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

+0

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

Trả lời

36

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ì interning, 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

+0

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

+1

@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'. –

+0

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

1

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.

1

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

+0

đ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 –

+0

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 a = f(); Tùy chọn b = g(); if (a.isPresent() && b.isPresent() && a.get()! = b.get()) {...} trông giống như một lỗi. Lý do nó không phải là một lỗi là f() và g() đã trở về những thứ như Optional.of (true), vv và tính năng auto-boxing làm cho nó chính xác. Tuy nhiên, lưu ý rằng đối với ints auto-boxing "cache" chỉ có giá trị lên đến 127 hoặc một cái gì đó như thế này, vì vậy tốt hơn là tránh dựa vào "bộ nhớ đệm". –

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