重写hashCode
1.hashCode是什么?
> hashCode是根据地址计算出来的十进制的数值,是地址的表现形式。
hashCode是根据地址算出来的一个数值 用于表示不同的对象在内存中的不同的空间
2.为什么需要重写hashCode
在一些散列数据结构中 如果两个对象使用equals比较为true 那么这两个对象的hashCode必须相同
注意:我们只是重写的hashCode 但并不会影响地址
String类型的hashCode已被JDK重写,和String类型的equals方法情况类似。
public class Person {
private String name;
private String idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public Person() {
}
public Person(String name, String idCard) {
this.name = name;
this.idCard = idCard;
}
public boolean equals(Object obj) {
// 自动提升 手动下降
if(this == obj) {
return true;
}
if(obj instanceof Person) {
Person p = (Person)obj;
if((this.getName().equals(p.getName())) && (this.getIdCard().equals(p.getIdCard()))) {
return true;
}
}
return false;
}
// 重写hashCode
// hashCode是什么?
// hashCode是根据地址算出来的一个数值 用于表示不同的对象在内存中的不同的空间
// 为什么需要重写hashCode
// 在一些散列数据结构中 如果两个对象使用equals比较为true 那么这两个对象的hashCode必须相同
// 注意:我们只是重写的hashCode 但并不会影响地址
public int hashCode() {
// result表示结果 用于最终返回
int result = 1;
// 权重 31 是一个比较合适的数值 用于计算hashCode
// 我们的计算器是如何进行数学计算的?
// 20 * 30
// 使用31是因为 任何数乘以31 等于这个数 左移5位 - 这个数本身
//JDK中也用31
// 左移几位 表示乘以2的几次方
// 右移几位 表示除以2的几次方
int prime = 31;
result = result * prime + (this.getName() == null ? 0 :this.getName().hashCode());
result = result * prime + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
return result;
}
public static void main(String[] args) {
Person person1 = new Person("汪淼", "4512157875121245421");
Person person2 = new Person("汪淼", "4512157875121245421");
//重写后的equals()方法,比较内容,结果为true
System.out.println(person1.equals(person2));
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
//"=="比较的是地址,不同的对象地址不同,重写hashCode不影响地址,结果为false
System.out.println(person1 == person2);
}
}
结果: