Tuesday, September 13, 2011

Java - Overriding Equals & Hashcode



package main.java.concepts;

Contract between equals and hashcode:

// 1) If two objects are equal according to the equals(object) , then hashCode() method on each of the two objects must produce the same integer result.
// -- Safest is to use the same fields for equals and hashcode. It makes sure above property is valid.
// 2) If two objects are UNEQUAL according to the equals() method, then hashCode() method on each of the two objects may OR may not give same integer results

// Whenever a.equals(b), then a.hashCode() must be same as b.hashCode().

// If you override equals, then you MUST override the hashcode.

// Use the same set of fields that you use to compute equals() to compute hashCode().


public class Equals_Hashcode {
 
 private String employeeId = null;
 private String name = null;
 private int age = 0;
 
 @Override
 public boolean equals(Object obj) {
  
                // Rule 1: Reflexive
  if(this == obj)
   return true;

                // Class check and Rule 4: Reflexive
  if(obj == null || this.getClass() != obj.getClass())
   return false;
  
  Equals_Hashcode otherObj = (Equals_Hashcode) obj;
  
  if(this.employeeId.equals(otherObj.employeeId) && this.name.equals(otherObj.name) && this.age == otherObj.age)
   return true;
  
  return false;
 }

 //  FYI - hashCode value of a Java String is computed as (String.hashCode()): s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 @Override
 public int hashCode() {
  int hashCode = 7;
  hashCode = (31 * hashCode) + (this.employeeId == null ? 0 : this.employeeId.hashCode());
  hashCode = (31 * hashCode) + (this.name == null ? 0 : this.name.hashCode());
  hashCode = (31 * hashCode) + (this.age == 0 ? 0 : new Integer(this.age).hashCode());
  return hashCode;
 }

}

As per the equals method in Java, it should be:

1) Reflexive : Object must be equal to itself.
2) Symmetric : if a.equals(b) is true then b.equals(a) must be true.
3) Transitive : if a.equals(b) is true and b.equals(c) is true then c.equals(a) must be true.
4) Consistent : multiple invocation of equals() method must result same value until any of properties are modified. So if two objects are equals in Java they will remain equals until any of there property is modified.
5) Null comparison : comparing any object to null must be false and should not result in NullPointerException. For example a.equals(null) must be false, passing unknown object, which could be null,  to equals in Java is is actually a Java coding best practice to avoid NullPointerException in Java.



Note: You should override equals and not overload it.

1 comment:


  1. giác tê dại. Trong lòng hắn lập tức đưa ra một quyết định, phải nhanh

    chóng lấy được bản đồ. Về phần Thiên Ly đan thì để một thời gian nữa
    học kế toán thực hành
    Chung cư imperia garden

    tiếng anh cho người đi làm
    khoá học kế toán excel
    học kế toán tại tphcm
    dịch vụ kế toán trọn gói
    diamond bay resort
    chung cư hoà bình green city
    five star garden
    học kế toán tại hải phòng
    trung tâm kế toán tại hoàng mai

    học kế toán tại bắc giang
    học kế toán tại thanh xuân

    cũng được.

    Nghĩ tới đây Vương Lâm cau mày. Cướp tấm bản đồ đang ở trong tay Phượng

    Loan, chẳng bằng ra ngoài giết đủ một trăm năm mười người còn hơn. Suy

    nghĩ một chút, ánh mắt Vương Lâm lóe lên, trong lòng đã có chủ ý.

    Thần thức của hắn thoáng động, trong đầu hắn liền hiện lên vị trí của

    hai người Dương Hùng và Lâm Đào. Lặng lẽ lui lại sau vài bước, hắn nhanh

    chóng bay về phía Dương Hùng.

    Dương Hùng là một trong số những đệ tử của Chiến Thần điện được lưu lại

    để tuần tra ngọn núi. Hắn không hề dám lơi lỏng, hết sức cảnh giác, quan

    sát khắp nơi. Tuy nhiên, hai mắt của hắn thỉnh thoảng lại liếc mắt nhìn

    về phía đỉnh núi. Mới vừa rồi có một nguyên anh bị mất thân thể vừa mới

    ReplyDelete