Trong Java, == và equals() là hai cách để so sánh giữa các đối tượng, nhưng chúng được sử dụng trong các ngữ cảnh khác nhau và so sánh các thứ khác nhau:
1. Toán tử ==
Dùng cho các kiểu nguyên thủy: Khi được sử dụng với các kiểu dữ liệu nguyên thủy như int, char, float, == so sánh giá trị trực tiếp của hai biến.
Dùng cho các đối tượng: Khi được sử dụng với các đối tượng, == so sánh các tham chiếu (địa chỉ bộ nhớ) của hai đối tượng. Nếu hai tham chiếu trỏ đến cùng một đối tượng trong bộ nhớ, == trả về true; nếu không, nó trả về false.
String a = new String("test");String b = new String("test");System.out.println(a == b); // false, vì a và b tham chiếu đến hai đối tượng khác nhau trong bộ nhớ.
2. Phương thức equals()
- So sánh nội dung của đối tượng: equals() được sử dụng để so sánh nội dung giữa hai đối tượng. Mặc định, phương thức equals() được thừa kế từ lớp Object và so sánh các tham chiếu, tương tự như ==. Tuy nhiên, nó thường được ghi đè trong các lớp để thực hiện so sánh giá trị logic, tức là kiểm tra xem hai đối tượng có "bằng nhau" theo ý nghĩa của dữ liệu chứa đựng hay không.
String a = new String("test");
String b = new String("test");
System.out.println(a.equals(b)); // true, vì nội dung của a và b giống nhau.
Khi nào sử dụng?
- Sử dụng == khi bạn muốn kiểm tra xem hai biến nguyên thủy có bằng nhau hay không, hoặc khi bạn muốn kiểm tra xem hai tham chiếu có trỏ đến cùng một đối tượng hay không.
- Sử dụng equals() khi bạn muốn kiểm tra xem hai đối tượng có bằng nhau về mặt "lô-gíc" hay không, đặc biệt sau khi ghi đè phương thức equals() để đảm bảo nó so sánh nội dung đúng cách.
Lưu ý rằng khi ghi đè equals(), bạn cũng nên ghi đè phương thức hashCode() để đảm bảo rằng hai đối tượng "bằng nhau" theo equals() cũng sẽ có cùng một giá trị hash. Điều này quan trọng đối với việc sử dụng các đối tượng như các khóa trong HashMap và HashSet.
Comments