最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

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()?

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);    }/*这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!例如HashMap无法保证key值"唯一性"下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的所以应该只用一个key表示 但是不重写将无法正确插入!*/}class Example{    public static void main(String[] args) {        per p1 = new per("张三", 18);        per p2 = new per("张三", 18);        HashMap map = new HashMap<>();        map.put(p1,1);        map.put(p2,2); //具体原理可以看put(k,v)源码!    }}

关键词: