Lớp không tên (Bài trước)
(Bài tiếp) Enum - liệt kê

So sánh đối tượng với Java

Cần phải nhớ rằng khi bạn tạo ra các đối tượng, biến lưu đối tượng là một tham chiếu tới đối tượng. Do vậy khi sử dụng toán tử so sánh bằng ==, nó sẽ sử dụng tham chiếu để so sánh chứ không sử dụng giá trị đối tượng so sánh.

class Animal {
  String name;
  Animal(String n) {
    name = n;
  }
}

class MyClass {
  public static void main(String[ ] args) {

    Animal a1 = new Animal("Robby");
    Animal a2 = new Animal("Robby");
    Animal a3 = a1;

    System.out.println(a1 == a2);//false
    System.out.println(a1 == a3);//true

  }
}
//Outputs
    false
    true

Bạn thấy a1, a2 có dữ liệu name giống nhau nhưng so sánh là khác nhau vì nó sử dụng tham khảo a1 là một đối tượng khác với a2 (a1,a2 ở hai vị trí bộ nhớ khác nhau).

a1, a3 đều trỏ đến một địa chỉ bộ nhớ lên nó bằng nhau.

equals()

Mỗi đối tượng đều có một phương thức định nghĩa sẵn equals() được sử dụng để so sánh về dữ liệu. Để sử dụng nó với lớp, bạn cần nạp chồng và thi hành kiểm tra điều kiện bằng nhau hay không.

Cách đơn giản với Eclipse là nhấn phải chuột cửa sổ soạn thảo lớp, chọn Source > Generate hashCode() and equals()..., sẽ tự sinh ra cho bạn

class Animal {
  String name;
  Animal(String n) {
    name = n;
  }

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Animal other = (Animal) obj;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
}

}

class MyClass {
	public static void main(String[] args) {

	    Animal a1 = new Animal("Robby");
	    Animal a2 = new Animal("Robby");

	    System.out.println(a1.equals(a2)); //true

	}
}

Ví dụ trên đã thực sự so sánh dữ liệu đối tượng


Đăng ký nhận bài viết mới
Lớp không tên (Bài trước)
(Bài tiếp) Enum - liệt kê