Tuesday, September 4, 2018

Importance of equals and hashcode method override

Importance of equals and hashcode method override:

Both equals and hashcode method present in java.lang.Object, hence these methods available for all java classes.

When comparing the objects, these methods are used.

Default implentation:

equals -> checks two objects are pointing same memory location (== check)
hashcode -> returns an integer representation of the object memory address. By default, this method returns a random integer that is unique for each instance. This integer might change between several executions of the application and won't stay the same.

Note : 
"If two objects are equal according to the equals(Object) method, then calling the hashcode() method on each of the two objects must produce the same integer result."

Example:

We will define Student class with and without overriding equals & hashcode.

Student.java
public class Student {
       private int id;
       private String name;
       public Student(int id, String name) {
             this.name = name;
             this.id = id;
      }
  // getters and setter
}


Student1.java -> Here we are override equals and hashcode methods.
public class Student {
       private int id;
       private String name;
       public Student(int id, String name) {
             this.name = name;
             this.id = id;
      }
  // getters and setter
@Override
public boolean equals(Object o) { // 3 if's and final comparison   
   if (o == null ) {
     return false;
    
     if(!(o instanceof Student1)) {
return false;
     }   
     if(o == this) {
     return true;
     }   
     Student1 student = (Student1)o;
     return this.getId() == student.getId() && this.getName() == student.getName(); 
 }

    }
}


Test:
package com.raj.basics;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import com.raj.model.Student;
import com.raj.model.Student1;

public class EqualsHashCodeOverride {

public static void main(String[] args) {

List<Student> students = new ArrayList<>();  // List will allow duplication and maintains order.
List<Student1> student1s = new ArrayList<>();

Student student1 = new Student(1,"Raj kumar");
Student student2 = new Student(1,"Raj kumar");

Student1 student11 = new Student1(1,"Raj kumar");
Student1 student12 = new Student1(1,"Raj kumar");

students.add(student1);students.add(student2);
student1s.add(student11);student1s.add(student12);

System.out.println("Students size : "+ students.size());  //2
System.out.println("Student1s size : "+ student1s.size()); //2

System.out.println("Students check : "+ students.contains(new Student(1,"Raj kumar"))); //false// Object's equals method considered for comparison(just memory location check)
System.out.println("Student1s check : "+ student1s.contains(new Student1(1,"Raj kumar"))); //true// Student1's equal method considered for comparison (deep check - logic done by us)

HashSet <Student> studentSet = new HashSet<>(); // HashSet wont allow duplicates.It will use hashcode for storing elements. Hashcode will vary for objects.
HashSet <Student1> student1Set = new HashSet<>();

studentSet.add(student1);studentSet.add(student2);
student1Set.add(student11);student1Set.add(student12);

System.out.println("Students set size : "+ studentSet.size()); // 2 because Object's hashcode taken for comparison
System.out.println("Student1s set size : "+ student1Set.size()); // 1 because Student1's equal method taken for consideraton.

System.out.println("HashSet contains = " + studentSet.contains(new Student(1, "Raj kumar")));  // false
System.out.println("HashSet contains = " + student1Set.contains(new Student1(1, "Raj kumar"))); // true


}

}

Output:
Students size : 2
Student1s size : 2
Students check : false
Student1s check : true
Students set size : 2
Student1s set size : 1
HashSet contains = false
HashSet contains = true


உப்பு மாங்காய்

சுருக்குப்பை கிழவி. சுருக்கங்கள் சூழ் கிழவி. பார்க்கும் போதெல்லாம் கூடையுடனே குடியிருப்பாள். கூடை நிறைய குட்டி குட்டி மாங்காய்கள். வெட்டிக்க...