Trong khi chúng ta lập trình, chúng ta thường phải sử dụng các toán tử so sánh để kiểm tra một điều kiện logic nào đó. Khi so sánh lớn hơn hay nhỏ hơn thì rất đơn giản đúng ko nhỉ. Nhưng khi chúng ta muốn so sánh bằng nhau thi chúng ta lúc thi sử dụng == lúc thì sử dụng phương thức equals(). Vậy tại sao lại như vậy? Không phải chúng đều dùng để so sánh bằng nhau hay sao? Bài viết này sẽ phân tích giúp các bạn hiểu rõ hơn nhé.
Chúng ta cùng xét ví dụ sau:
String a = new String(“Hello CodeGym”);
String b = new String (“Hello CodeGym”);
String c = a;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
Khi này màn hình sẽ hiển thị kết quả là:
False
True
True
True
Trước khi đi vào tìm hiểu tại sao == và equals() khác nhau thì chúng ta cùng tìm hiểu lại ý nghĩa của phép gán (=).
Khi ta sử dụng 1 câu lệnh gán String a = new String(“Hello CodeGym”) thì hệ thống sẽ tạo ra 1 ô nhớ chứa giá trị là “Hello CodeGym” và sau đó khởi tạo 1 biến a có kiểu String và trỏ vào ô nhớ đó.
Tương tự đối với câu lệnh thứ 2 thì hệ thống tiếp tục tạo 1 ô nhớ có giá trị là “Hello CodeGym” va khởi tạo biến b có kiểu String trỏ vào ô nhớ đó.
Cuối cùng câu lệnh thứ 3 thì biến c được khởi tạo và trỏ thẳng vào giá trị của biến a – tức là ô nhớ thứ nhất chứ không phải khở tạo ra một ô nhớ khác.
Vậy quay lại các cách so sánh trên thì chúng ta có kết luận như sau:
- Phép so sánh == sẽ so sánh 2 object có cùng trỏ vào 1 ô nhớ hay không. Nếu đúng thì trả về true, sai sẽ trả về false.
- Phương thức equals() sẽ so sánh 2 object nhưng chỉ so sánh về mặt giá trị. Nếu giá trị bằng nhau thì sẽ trả về true, ngược lại sẽ trả về false
Chú ý thêm: Qua cách tìm hiểu lại ý nghĩa phép gán thì mình còn bổ sung thêm là nếu A là đối tương có thể thay đổi được giá trị mà C gán bằng A. Khi A hoặc C thay đổi giá trị thì biến còn lại sẽ thay đổi giá trị theo (vì cùng trỏ vào 1 ô nhớ). Vậy nên khi muốn lấy giá trị của đối tượng A và sửa đổi nhưng vẫn muốn giữ lại giá trị cũ thì chúng ta sử dụng phương thức clone(). Nếu đối tượng muốn sao chép là giá trị không thể thay đổi thì có thể sửa dụng phép gán được.
Tóm lại, chúng ta đã tìm hiểu rõ ràng về == và equals(), vậy nên chúng ta sẽ hiểu rõ hơn khi nào cần dùng và khi nào không. Bên cạnh đó chúng ta còn hiểu sâu hơn về phép gán(=) để chúng ta tránh bị nhầm khi sử dụng.