Phân biệt toán tử == và phương thức equal() trong Java.
Hôm nay mình gặp vấn đề vô cùng thú vị. Là dân .NET, mới làm quen Java, và thử chạy chương trình hơn 1 ngày, cuối cùng tìm ra lỗi vô cùng đơn giản, so sánh chuỗi sai.
C#: Bạn có thể dễ dàng so sánh 2 chuỗi giống nhau bằng câu lệnh s1==s2 nhưng trong Java, bạn luôn nhận về kết quả false. Tại sao như vậy?
VD1:
Biến kiểu tham trị bao gồm các kiểu nguyên thủy của JAVA như: int, long, double…
Biến kiểu tham chiếu bao gồm: String, array, kiểu đối tượng…
Khi sử dụng biến kiểu tham trị, JAVA chỉ cho phép bạn sử dụng toán tử so sánh “==”.
Khi sử dụng biến kiểu tham chiếu, JAVA cho phép sử dụng cả toán tử “==” và equals(). Tuy nhiên, khi sử dụng toán tử “==”, bộ xử lý của JAVA sẽ so sánh xem 2 biến tham chiếu này có trỏ đến cùng một đối tượng hay không, còn nếu bạn sử dụng phương thức equals(), bộ xử lý JAVA sẽ so sánh giá trị của 2 biến tham chiếu đó. Điều này lý giải tại sao ở ví dụ trên, khi sử dụng phép toán: a.equals(b) => kết quả trả về bằng true, trong khi a==b => kết quả trả về lại bằng false.
Để hiểu hơn, tôi xét thêm một ví dụ nữa:
C#: Bạn có thể dễ dàng so sánh 2 chuỗi giống nhau bằng câu lệnh s1==s2 nhưng trong Java, bạn luôn nhận về kết quả false. Tại sao như vậy?
VD1:
String a = new String(“abc”); String b = new String(“abc”); System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?false System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?trueTrong JAVA, có 2 kiểu biến: biến tham trị và tham chiếu.
Biến kiểu tham trị bao gồm các kiểu nguyên thủy của JAVA như: int, long, double…
Biến kiểu tham chiếu bao gồm: String, array, kiểu đối tượng…
Khi sử dụng biến kiểu tham trị, JAVA chỉ cho phép bạn sử dụng toán tử so sánh “==”.
Khi sử dụng biến kiểu tham chiếu, JAVA cho phép sử dụng cả toán tử “==” và equals(). Tuy nhiên, khi sử dụng toán tử “==”, bộ xử lý của JAVA sẽ so sánh xem 2 biến tham chiếu này có trỏ đến cùng một đối tượng hay không, còn nếu bạn sử dụng phương thức equals(), bộ xử lý JAVA sẽ so sánh giá trị của 2 biến tham chiếu đó. Điều này lý giải tại sao ở ví dụ trên, khi sử dụng phép toán: a.equals(b) => kết quả trả về bằng true, trong khi a==b => kết quả trả về lại bằng false.
Để hiểu hơn, tôi xét thêm một ví dụ nữa:
String a = new String(“abc”); String b = a; System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?true System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?trueNếu bạn có thắc mắc gì hãy để lại comment. Hy vọng các bạn có được một kiến thức bổ ích.
Tham khảo và chỉnh sửa.
Nguồn: Mobile's program blog
Nhận xét
Đăng nhận xét