Trong Java, việc so sánh các đối tượng có thể được thực hiện bằng hai cách: sử dụng toán tử == và phương thức equals(). Mặc dù cả hai đều được sử dụng để so sánh, nhưng chúng có cách thức hoạt động khác nhau và mục đích khác nhau. Bài viết này sẽ giải thích chi tiết sự khác biệt giữa ==equals().

1. Toán tử ==

1.1. Định nghĩa

  • Toán tử == được sử dụng để so sánh hai giá trị hoặc hai đối tượng. Khi sử dụng với kiểu nguyên thủy, == so sánh giá trị thực tế của biến. Khi sử dụng với đối tượng, == so sánh địa chỉ bộ nhớ của chúng.

1.2. Ví dụ

int a = 5;
int b = 5;
System.out.println(a == b); // Kết quả: true

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // Kết quả: false (so sánh địa chỉ bộ nhớ)

Trong ví dụ trên, str1str2 là hai đối tượng khác nhau trong bộ nhớ, mặc dù chúng có nội dung giống nhau.

2. Phương thức equals()

2.1. Định nghĩa

  • Phương thức equals() được định nghĩa trong lớp Object và có thể được ghi đè (override) trong các lớp khác. Mục đích chính của equals() là so sánh nội dung của hai đối tượng thay vì địa chỉ bộ nhớ của chúng.

2.2. Ví dụ

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // Kết quả: true (so sánh nội dung)

Trong ví dụ này, phương thức equals() so sánh nội dung của hai chuỗi, do đó kết quả là true.

3. Sự khác biệt chính

Tiêu chí==equals()
So sánh kiểu dữ liệuSo sánh giá trị (đối với kiểu nguyên thủy) và địa chỉ bộ nhớ (đối với đối tượng)So sánh nội dung của đối tượng
Mặc địnhKhông thể ghi đèCó thể ghi đè
Sử dụngDùng để kiểm tra xem hai tham chiếu có trỏ đến cùng một đối tượng hay khôngDùng để kiểm tra nội dung của hai đối tượng
Thực hiệnNhanh hơn (không cần kiểm tra nội dung)Chậm hơn (cần kiểm tra nội dung)

4. Khi nào nên sử dụng cái nào?

  • Sử dụng ==:
    • Khi bạn muốn kiểm tra xem hai biến tham chiếu có trỏ đến cùng một đối tượng hay không.
    • Khi so sánh kiểu nguyên thủy (int, char, float, …).
  • Sử dụng equals():
    • Khi bạn cần so sánh nội dung của hai đối tượng.
    • Khi làm việc với các lớp tùy chỉnh mà bạn đã ghi đè phương thức equals().

5. Kết luận

Sự khác biệt giữa == và phương thức equals() trong Java là rất quan trọng để hiểu cách so sánh các đối tượng. Toán tử == so sánh địa chỉ bộ nhớ hoặc giá trị của kiểu nguyên thủy, trong khi phương thức equals() so sánh nội dung của các đối tượng. Để tránh các lỗi tiềm ẩn khi so sánh đối tượng, bạn nên sử dụng phương thức equals() khi cần kiểm tra nội dung của các đối tượng trong Java.