Java中为什么重写equals()也需要重写hashCode方法
Java中为什么重写equals()也需要重写hashCode()?
所有类默认继承Object类 先看一下Object源码
package java.lang;
public class Object {
//默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
public native int hashCode();
//默认调用的equals方法比较的是'=='比较
//基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
public boolean equals(Object obj) {
return (this == obj);
}
}
结论
- equals()返回结果为true hashCode()一定相同
- '=='结果为true hashCode()一定相同
- '=='结果为false hashCode()有可能相同(哈希冲突)
hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值
回到刚刚哪个问题 为什么重写equals还要重写hashCode()?
关注公众号:Java技术迷,获取java相关书籍!
public class per {
private String name;
private int age;
public per(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object o){
if (this==o)return true;
if (o==null||o.getClass()!=this.getClass())return false;
per o1 = (per) o;
return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
}
public int hashCode(){
return Objects.hash(name,age);
}
}
class Example{
public static void main(String[] args) {
per p1 = new per("张三", 18);
per p2 = new per("张三", 18);
HashMap<per,Integer> map = new HashMap<>();
map.put(p1,1);
map.put(p2,2); //具体原理可以看put(k,v)源码!
}
}
到此这篇关于Java中为什么重写equals()也需要重写hashCode()?的文章就介绍到这了,更多相关Java 重写equals()为什么重写hashCode()内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关文章