hashCode和Equalsed之间的关系?
在Java中,每个对象都可以调用自己的hashcode方法得到自己的hhashcode值,相当于对象的指纹信息,通常来说世界上没有完全相同的两个指纹,但是在Java中做不到这么绝对,但是我们可以用hashcode来做一些提前的判断,比如:
如果两个对象的hashcode不相同,那么这两个对象肯定是不同的两个对象。
如果两个对象的hashcode相同,那么这两个对象可能是一个对象,也可能是两个对象。
如果两个对象相等,那么他们的hashcode一定相同。
在Java的实现类中,比较两个对象是否相等时,会根据上面的原则,会先调用对象的hashcode方法得到hashcode进行比较,如果hashcode不同,可以认定两个对象不相同,如果hashcode相同,会进一步调用equals方法,用来确定最终对象是不是相同的,通常equals方法实现会比较重,逻辑比较复杂,而hashcode就是得到一个hashcode,实际上就是一个数字,相对而言较轻,所以在比较两个对象时,通常会根据hashcode比较一下。
如果重写了equals方法,一定要遵守以上规则。
代码测试:
hashmap.get()底层会先比较两个对象的hash值是否相等,然后才去比较其他内容;
(1)实体类(重写equals和hashcode方法)
public class shiTi {
private String name;
public shiTi(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
shiTi shiTi = (shiTi) o;
return Objects.equals(name, shiTi.name);
}
// @Override
// public int hashCode() {
// return name.hashCode();
// }
}
(2)测试类
public class test {
public static void main(String[] args) {
Map<shiTi,Integer> map = new HashMap<>();
shiTi shiTi = new shiTi("test");
map.put(shiTi,123);
System.out.println(map.get(new shiTi("test")));
}
}
运行结果:
未重写hashcode方法:(这里调用底层hashcode得到hash值,对比两个对象不相等,所以get为空)
重写hashcode方法:(这里调用重写的hashcode方法,根据name得到hash值,name属性相同认为两个对象相同,故可以得到value值)