hashcode() 与 equals() 方法的区别
hashCode() 不相等,equals() 也一定不相等;hashcode() 相等,equals() 不一定相等。
集合体系中的应用
在集合中要重写hashCode( )和equals( )。
-
解决哈希冲突
在散列表(哈希表)中,两个不同的key其哈希值可能相同,当哈希值相同时即出现了哈希冲突。而在 HashSet 中不允许出现重复对象,而在 HashMap 中则不允许出现重复的 key 值。因此,当hashCode( )返回相同的哈希值时,还要用equals( )进行比较。 -
提高效率
我们可以直接通过 equals() 方法来判断两个对象是否相等,因为所有重写的子类应该遵循了 equals() 方法的原则,从而来判断是否对象是否重复。但是如果每两个对象都通过 equals() 来判断是否重复,那么效率会大大降低,例如在 String 重写的 equals() 方法中,会循环判断每个字符是否相等。
为了提高程序的运行的效率,Java 在两个判断两个对象是否相等的时候,先通过 hashcode() 方法来判断两个对象是否相等,如果 hashcode() 不相等,就没有进行 equals() 方法的必要,因为两个对象肯定不相等;而如果 hashcode() 相等,那么再进行 equals() 判断,就能确定两个对象是否相等了,因为 hashcode() 方法相等,其 equals() 方法返回值不一定相等。所以需要完全确定两个对象是否相等,需要 hashcode() 与 equals() 方法结合来使用。
转载自 https://blog.yeskery.com/articles/353896055
简单代码实现
import java.util.HashSet;
class Student{
private int id;
private String name;
public Student(int id,String name) {
this.id=id;
this.name=name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
public class myTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1=new Student(111, "xvxiaoqing");
Student s2=new Student(112, "hupengcheng");
Student s3=new Student(113, "liusaisai");
Student s4=new Student(111, "xvxiaoqing");
HashSet<Student> h=new HashSet<>();
h.add(s1);
h.add(s2);
h.add(s3);
h.add(s4);
System.out.println(h);
}
}