Sự khác nhau giữa == và equals trong Java

Trong Java, toán tử == và equals() method đều được sử dụng để so sánh bằng, tuy nhiên giữa chúng lại có những điểm khác biệt rất lớn mà trong bài viết này chúng ta sẽ cùng nhau tìm hiểu.

Toán tử == là gì

Toán tử == được dùng để so sánh 2 tham chiếu hay còn được gọi là địa chỉ vùng nhớ dùng để lưu object bên trong heap. Toán tử == trả về true nếu 2 object được so sánh có cùng địa chỉ vùng nhớ.

Equals() method là gì?

Trong khi đó, equals() method được sử dụng với mục đích là so sánh trạng thái của 2 object. Có nghĩa là nếu 2 object mà giá trị của các thuộc tính tương ứng bên trong chúng bằng nhau thì 2 object bằng nhau.

Tuy nhiên chúng ta cần lưu ý rằng java.lang.Object class là superclass của tất cả các class khác trong Java, bên trong Object class mặc định đã cung cấp trình triển khai mặc định cho equals() method, và triển khai mặc định này hoạt động tương tự như toán tử ==.

public boolean equals(Object obj) {
        return (this == obj);
 }

Do vậy để đạt được việc so sánh trạng thái của 2 object thay vì địa chỉ vùng nhớ thì chúng ta cần override lại equals() method. Tuy nhiên các bạn cứ yên tâm vì hầu hết các IDE như IntellIJ, Eclipse đều hỗ trợ sinh code cho hàm equals() các tự động, chúng ta không cần phải tự viết tay những method này. Ngoài ra lombok cũng hỗ trợ equalsandhashcode annotation để sinh code cho equals() và hashCode() cách tự động.

Ví dụ, java.lang.String override equals và hashcode bên trong nó sẽ kiểm tra giá trị của 2 chuỗi xem có bằng nhau hay không.

Sự khác nhau giữa toán tử == và equals()

Sau khi làm rõ 2 khái niệm về toán tử == và equals() method thì chúng ta có thể tổng quát một số điểm khác biệt giữa chúng ta như sau:

  • Đầu tiên, equals() là một method được định nghĩa bên trong Object class, còn toán tử == là một loại toán tử có thể dùng để so sánh bằng các kiểu dữ liệu nguyên thủy hoặc so sánh bằng địa chỉ vùng nhớ của 2 object.
  • Chúng ta có thể override method equals() theo cách mà chúng ta định nghĩa 2 object thế nào là bằng nhau. Ví dụ 2 object employee có rất nhiều thuộc tính nhưng chúng ta chỉ cần id và name bằng nhau thì chúng bằng nhau. Còn toán tử == thì chúng ta không thể làm điều tương tự.
  • Equals được sử dụng với mục đích chính là so sánh trạng thái của 2 object trong khi toán tử == dù để so sánh địa chỉ vùng nhớ.
public class Test {
    public static void main(String[] args)
    {
        String s1 = new String("HELLO");
        String s2 = new String("HELLO");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

Trong ví dụ trên chúng ta khởi tạo 2 String object với cùng giá trị HELLO. Tuy nhiên:

  • Sử dụng toán tử ==, nó sẽ đi so sánh địa chỉ vì vậy nó sẽ trả về false vì 2 string object được lưu ở 2 vùng nhớ riêng.
  • Sử dụng equals() trả về true vì nó được String class override lại để so sánh giá trị chuỗi tương ứng.

Nguồn

https://www.java67.com/2012/11/difference-between-operator-and-equals-method-in.html

https://www.geeksforgeeks.org/difference-equals-method-java/

5 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x