hashCode和equals方法的区别
-
hashCode()和equals()方法都是Object类中的方法,如果类中不重写此方法
- hashCode():返回的是对象的地址值。
- equals():方法用来比较这两个对象的地址值是否相同。
-
类中重写该方法后的作用:
- hashCode():返回的是根据对象的成员变量计算出的一个整数
- equals():比较的是两个对象中成员信息是否相同
-
类中重写hashCode和equals比较两个对象是否相等。
- 两个对象通过equals方法比较是相等的,那么hashcode方法肯定也是相等的,也就是equals方法是绝对可靠的。
- 两个对象通过hashCode方法比较相等,但是equals方法比较却不一定相等,也就是hashCode不是绝对可靠的。
-
通过hashCode和equals方法搭配使用比较对象是否相等是如何提高效率的:
- 以HashSet为例该集合的特点是无序,唯一。如果该集合中已经含有很多个元素,再进行元素的添加时,首先要该集合中是否存在该元素,如果使用equals方法,则需要和集合中的每一个元素进行比较,非常影响效率。这里HashSet底层采用的是散列表的逻辑存储结构,该结构进行存储时,首先通过hashCode来获取待添加元素的哈希码,在根据hashCode来获取对应的底层数组的索引,然后再通过比较看是否hashCode相同的元素的值是否相同,这时候在使用equals来比较。
// Object中未重写的hashCode和equals方法。
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
两个对象通过hashCode方法比较相等,但是equals方法比较却不一定相等
这里自定义一个学生类,重写equals和hashCode方法。
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
测试equals和hashcode
public static void main(String[] args) {
Student stu1 = new Student("通话", 11);
Student stu2 = new Student("重地", 11);
System.out.println(stu1.hashCode() == stu2.hashCode());//true
System.out.println(stu1.equals(stu2));//false
}