.:: CODE SNIPPET ::.

"Your time is limited, so don't waste it living someone else's life"

Sự khác biệt giữa hàm equals() và operator ==


Trước khi bàn về sự khác biệt giữa “==” và phương thức equals(), một điều quan trọng phải hiểu là một đối tượng (object) vừa có một địa chỉ  trong bộ nhớ và một tình trạng cụ thể phụ thuộc vào các giá trị trong đối tượng.

operator “==”

Trong Java, khi operator “==” được dùng để so sánh hai đối tượng, thì nó kiểm tra xem các đối tượng có tham chiếu đến cùng một nới trên bộ nhớ hay không. Mặt khác, nó kiểm tra xem hai tên đối tượng về cơ bản có tham chiếu đến cùng một địa chỉ nhớ hay không.  Ví dụ sau sẽ làm sáng tỏ điều này:

String obj1 = new String("xyz");

String obj2 = new String("xyz");

if(obj1 == obj2)
   System.out.println("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

Hãy xem xét đoạn code trên xuất ra gì. Có phải bạn đoán output sẽ là obj1==obj2 là TRUE đúng không? Nếu vậy bạn đã thực sự sai. Ngay cả khi các chuỗi có chung các ký tự (“xyz”), đoạn code trên sẽ xuất ra:

obj1==obj2 is FALSE

Operator “==” so sánh các địa chỉ nhớ của các đối tượng trong bộ nhớ.
Giải thích sâu hơn: như đã đề cập bên trên, operator “==” trên thực tế kiểm tra các đối tượng chuỗi (obj1 và obj2) có tham chiếu đến đúng một địa chỉ nhớ hay không. Mặt khác, nếu cả obj1 và obj2 chỉ khác nhau cái tên cho cùng một đối tượng thì operator “==” sẽ trả về TRUE khi so sánh hai đối tượng. Ví dụ sau sẽ làm rõ:

String obj1 = new String("xyz");

// now obj2 and obj1 reference the same place in memory
String obj2 = obj1;

if(obj1 == obj2)
   System.out.printlln("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

Để ý trong đoạn code trên thì obj2 và obj1 cùng tham chiếu đến cùng một nơi trên bộ nhớ vì dòng:” String obj2=obj1;”. Và vì operator “==” so sánh tham chiếu bộ nhớ của mỗi đối tượng, nó sẽ trả về TRUE.

obj1==obj2 is TRUE

Phương thức equal()
Hãy tìm hiểu về phương thức equal(). Nó được định nghĩa trong lớp Object, mà từ nó mỗi lớp là một lớp con trực tiếp hoặc gián tiếp( trong Java tất cả các lớp đều bắt nguồn từ lớp Object). Mặc định thì phương thức equals() hoạt động như là operator “==”- nghĩa là nó cũng kiểm tra xem các đối tượng có tham chiếu đến cùng một nơi trên bộ nhớ hay không. Nhưng, phương thức equals() trong thực tế được hiểu là so sánh các thành phần của hai đối tượng, và không phải so sánh địa chỉ bộ nhớ của chúng.
Thế hành vi đó được thành lập như thế nào? Đơn giản là lớp equals được override để lấy những phương thức cần thiết nhờ đó nội dung của đối tượng được so sánh thay vì địa chỉ của đối tượng. Đây là một sự tập luyện việc override phương thức equals, bạn nên so sánh các giá trị trong đối tượng để tìm ra tính cân bằng. Giá trị nào bạn so sánh thì phụ thuộc vào bạn. Đây là một điều quan trọng phải hiểu, vì vậy chúng ta sẽ lập lại nó là: về mặc định equals() hoạt động như là operator “==” là so sánh địa chỉ của các đối tượng. Nhưng khi bạn override phương thức equals(), bạn sẽ so sánh các giá trị của đối tượng.
Một ví dụ về hàm equals() được override
lớp String trong Java trên thực tế override phương thức equals() mặc định trong lớp Object rồi, và nó override phương thức đó để nó kiểm tra giá trị của các chuỗi, thay vì địa chỉ bộ nhớ. Nghĩa là nếu bạn gọi phương thức equals() để so sánh hai đối tượng chuỗi, thì miễn là dãy các ký tự của chuỗi bằng nhau thì hai chuỗi sẽ bằng nhau. Ví dụ:

String obj1 = new String("xyz");

String obj2 = new String("xyz");

if(obj1.equals(obj2))
   System.out.printlln("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

đoạn code trên sẽ cho ra output

obj1==obj2 is TRUE

Đó cũng là sự khác biệt giữa phương thức equals() và operator “==” trong Java

Advertisements

4 responses to “Sự khác biệt giữa hàm equals() và operator ==

  1. Pingback: Chuỗi trong Java « .:: Hoàng Minh ::.

  2. Mây Trắng February 15, 2014 at 11:21 AM

    Cảm ơn bạn rất nhiều, bạn viết thật là dễ hiểu, chắc kiến thức của bản uyên thâm lắm nhỉ vì ngôn ngữ là sự thể hiện của trí tuệ mà

  3. Hoàng Minh February 15, 2014 at 11:31 AM

    Hihi, bạn quá khen rồi.

  4. Anonymous May 22, 2015 at 11:08 AM

    Hay!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: