/**
* Returns a hash code value for the object. This method is
* supported for the benefit of hash tables such as those provided by
* {@link java.util.HashMap}.
* ...
*/
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
概要解释如下
在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值。
因此有如下原则:
原则A:如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值.
原则B:如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同.
应用场景一
在定义类时,会希望两个不同对象的属性值相同时就认为它们相同。所以要重写equals()方法,按照原则,重写了equals()方法,也要重写hashCode()方法,要保证上面所述的A,B原则。所以java中的很多类都重写了这两个方法,例如String类、包装类等。
应用场景二
HashSet存放元素时,根据元素的hashCode值快速找到要存储的位置。添加元素时,如果两个对象的hashCode()返回值不同,直接添加;如果两个对象的hashCode()返回值相同,两个对象会通过equals()比较,如果返回值为true,则不放入;如果返回值为false,则这个时候会以链表的形式在同一个位置上存放两个元素(7上8下)。
例子
public class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
// 如果为同一对象的不同引用,则相同
if (this == obj) {
return true;
}
// 如果传入的对象为空,则返回false
if (obj == null) {
return false;
}
// 如果两者属于不同的类型,不能相等
if (getClass() != obj.getClass()) {
return false;
}
// 类型相同, 比较内容是否相同
Student other = (Student) obj;
return name == other.name && age == other.age;
}
@Override
public int hashCode() {
int result = 17;
//同一属性的值相同,那它们的哈希值也相同
result = 31 * result + (name == null ? 0 : name.hashCode());
result = 31 * result + (age == null ? 0 : age.hashCode());
return result;
}
}
public class EqualsDemo {
public static void main(String[] args) {
Student stu1 = new Student("awu", 22);
Student stu2 = new Student("awu", 22);
Student stu3 = new Student("gy", 22);
System.out.println(stu1.equals(stu2));
System.out.println(stu1.equals(stu3));
System.out.println(stu2.equals(stu3));
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
System.out.println(stu3.hashCode());
}
}
结果