We will see benefit by overriding the hashcode() and equals() methods in java.
JVM will assign unique hashcode value for each and every object created and if we did not over ride the hashcode()) method, no way to get same hashcode value for two objects.
As equals() method compare two objects if they have same value or not, then what is the need of overriding hashcode() method?
To answer this ,we need to know about how hashcode will work in java.
As mentioned in above diagram each java object will be placed in bucket depending on hashcode value. Here it is not necessary every different object does have different hashcode value. Two different objects might have same hashcode.
When we try to insert key in hashmap, it will check and get the hashcode value and find the bucket and insert the object into it if any other object is not available in the same bucket. If some other object is already available in that bucket, then it will check for equals() method on key and override if key is same other wise i.e key is different, it will insert the other object in next node of same bucket.
If object does not override hashcode() method, and if we use the object as key to store, then we will not get the object back as shown below.
package com.sample.java.testing;
public class OverrideHascodeBean {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
package com.sample.java.testing;
import java.util.HashMap;
public class OverrideHascodeEquals {
public static void main(String a[]){
HashMap<OverrideHascodeBean, String> hashMap = new HashMap<OverrideHascodeBean, String>();
OverrideHascodeBean bean1 = new OverrideHascodeBean();
bean1.setId(001);
bean1.setName("Java");
OverrideHascodeBean bean2 = new OverrideHascodeBean();
bean2.setId(002);
bean2.setName("J2ee");
OverrideHascodeBean bean3 = new OverrideHascodeBean();
bean3.setId(003);
bean3.setName("Spring");
OverrideHascodeBean bean4 = new OverrideHascodeBean();
bean4.setId(001);
bean4.setName("Java");
hashMap.put(bean1, "First");
hashMap.put(bean2, "Second");
hashMap.put(bean3, "Third");
hashMap.put(bean4, "FirstDup");
for (OverrideHascodeBean bean : hashMap.keySet()) {
System.out.println(hashMap.get(bean).toString());
}
//creating object similar to first.
OverrideHascodeBean bean5 = new OverrideHascodeBean();
bean5.setId(001);
bean5.setName("Java");
if (hashMap.get(bean5) == null) {
// here we created object(5) which is similar to object(1) but when
// we try to get the bean from map it is not able to find. As we did
// not override Hashcode() and equals() method, duplicate objects
// are added not replaced even if we pass same key.
System.out.println("Objectn not found");
}
}
}
Output : Third
First
FirstDup
Second
Objectn not found
See below example when we override equals and hashcode methods and we will find the object if we pass duplicate object.
package com.sample.java.testing;
public class OverrideHascodeBean {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
OverrideHascodeBean bean = (OverrideHascodeBean) o;
return bean.id == this.id && bean.name.equals(this.name);
}
@Override
public int hashCode() {
return name.hashCode() + id;
}
}
package com.sample.java.testing;
import java.util.HashMap;
public class OverrideHascodeEquals {
public static void main(String a[]){
HashMap<OverrideHascodeBean, String> hashMap = new HashMap<OverrideHascodeBean, String>();
OverrideHascodeBean bean1 = new OverrideHascodeBean();
bean1.setId(001);
bean1.setName("Java");
OverrideHascodeBean bean2 = new OverrideHascodeBean();
bean2.setId(002);
bean2.setName("J2ee");
OverrideHascodeBean bean3 = new OverrideHascodeBean();
bean3.setId(003);
bean3.setName("Spring");
OverrideHascodeBean bean4 = new OverrideHascodeBean();
bean4.setId(001);
bean4.setName("Java");
hashMap.put(bean1, "First");
hashMap.put(bean2, "Second");
hashMap.put(bean3, "Third");
hashMap.put(bean4, "FirstDup");
for (OverrideHascodeBean bean : hashMap.keySet()) {
System.out.println(hashMap.get(bean).toString());
}
//creating object similar to first.
OverrideHascodeBean bean5 = new OverrideHascodeBean();
bean5.setId(001);
bean5.setName("Java");
if (hashMap.get(bean5) == null) {
// here we created object(5) which is similar to object(1) but when
// we try to get the bean from map it is not able to find. As we did
// not override Hashcode() and equals() method, duplicate objects
// are added not replaced even if we pass same key.
System.out.println("Objectn not found");
}else{
//as we override hashcode and equals method, hashmap will replace the old value with new value if we pass give duplicate key
System.out.println("Object found");
}
}
}
output: Second
Third
FirstDup
Object found
JVM will assign unique hashcode value for each and every object created and if we did not over ride the hashcode()) method, no way to get same hashcode value for two objects.
As equals() method compare two objects if they have same value or not, then what is the need of overriding hashcode() method?
To answer this ,we need to know about how hashcode will work in java.
As mentioned in above diagram each java object will be placed in bucket depending on hashcode value. Here it is not necessary every different object does have different hashcode value. Two different objects might have same hashcode.
When we try to insert key in hashmap, it will check and get the hashcode value and find the bucket and insert the object into it if any other object is not available in the same bucket. If some other object is already available in that bucket, then it will check for equals() method on key and override if key is same other wise i.e key is different, it will insert the other object in next node of same bucket.
If object does not override hashcode() method, and if we use the object as key to store, then we will not get the object back as shown below.
package com.sample.java.testing;
public class OverrideHascodeBean {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
package com.sample.java.testing;
import java.util.HashMap;
public class OverrideHascodeEquals {
public static void main(String a[]){
HashMap<OverrideHascodeBean, String> hashMap = new HashMap<OverrideHascodeBean, String>();
OverrideHascodeBean bean1 = new OverrideHascodeBean();
bean1.setId(001);
bean1.setName("Java");
OverrideHascodeBean bean2 = new OverrideHascodeBean();
bean2.setId(002);
bean2.setName("J2ee");
OverrideHascodeBean bean3 = new OverrideHascodeBean();
bean3.setId(003);
bean3.setName("Spring");
OverrideHascodeBean bean4 = new OverrideHascodeBean();
bean4.setId(001);
bean4.setName("Java");
hashMap.put(bean1, "First");
hashMap.put(bean2, "Second");
hashMap.put(bean3, "Third");
hashMap.put(bean4, "FirstDup");
for (OverrideHascodeBean bean : hashMap.keySet()) {
System.out.println(hashMap.get(bean).toString());
}
//creating object similar to first.
OverrideHascodeBean bean5 = new OverrideHascodeBean();
bean5.setId(001);
bean5.setName("Java");
if (hashMap.get(bean5) == null) {
// here we created object(5) which is similar to object(1) but when
// we try to get the bean from map it is not able to find. As we did
// not override Hashcode() and equals() method, duplicate objects
// are added not replaced even if we pass same key.
System.out.println("Objectn not found");
}
}
}
Output : Third
First
FirstDup
Second
Objectn not found
See below example when we override equals and hashcode methods and we will find the object if we pass duplicate object.
package com.sample.java.testing;
public class OverrideHascodeBean {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
OverrideHascodeBean bean = (OverrideHascodeBean) o;
return bean.id == this.id && bean.name.equals(this.name);
}
@Override
public int hashCode() {
return name.hashCode() + id;
}
}
package com.sample.java.testing;
import java.util.HashMap;
public class OverrideHascodeEquals {
public static void main(String a[]){
HashMap<OverrideHascodeBean, String> hashMap = new HashMap<OverrideHascodeBean, String>();
OverrideHascodeBean bean1 = new OverrideHascodeBean();
bean1.setId(001);
bean1.setName("Java");
OverrideHascodeBean bean2 = new OverrideHascodeBean();
bean2.setId(002);
bean2.setName("J2ee");
OverrideHascodeBean bean3 = new OverrideHascodeBean();
bean3.setId(003);
bean3.setName("Spring");
OverrideHascodeBean bean4 = new OverrideHascodeBean();
bean4.setId(001);
bean4.setName("Java");
hashMap.put(bean1, "First");
hashMap.put(bean2, "Second");
hashMap.put(bean3, "Third");
hashMap.put(bean4, "FirstDup");
for (OverrideHascodeBean bean : hashMap.keySet()) {
System.out.println(hashMap.get(bean).toString());
}
//creating object similar to first.
OverrideHascodeBean bean5 = new OverrideHascodeBean();
bean5.setId(001);
bean5.setName("Java");
if (hashMap.get(bean5) == null) {
// here we created object(5) which is similar to object(1) but when
// we try to get the bean from map it is not able to find. As we did
// not override Hashcode() and equals() method, duplicate objects
// are added not replaced even if we pass same key.
System.out.println("Objectn not found");
}else{
//as we override hashcode and equals method, hashmap will replace the old value with new value if we pass give duplicate key
System.out.println("Object found");
}
}
}
output: Second
Third
FirstDup
Object found