IT评测·应用市场-qidao123.com

标题: Java中为什么重写equals()也需要重写hashCode()? [打印本页]

作者: 我可以不吃啊    时间: 2023-4-25 20:33
标题: Java中为什么重写equals()也需要重写hashCode()?
所有类默认继承Object类 先看一下Object源码
  1. package java.lang;
  2. public class Object {
  3.         //默认调用本地的hashcode()方法 根据内存地址生成hash值 避免不了哈希冲突
  4.         public native int hashCode();
  5.         //默认调用的equals方法比较的是'=='比较
  6.         //基本类型比较的是两者的值是否相同 而引用类型比较两者的是引用地址(对象)是否相同
  7.         public boolean equals(Object obj) {
  8.                 return (this == obj);
  9.     }
  10. }
复制代码
结论

hashCode()重写规范就是保证equals()相同的两个对象拥有相同的哈希值
回到刚刚哪个问题 为什么重写equals还要重写hashCode()?
  1. public class per {
  2.     private String name;
  3.     private int age;
  4.     public per(String name, int age) {
  5.         this.name = name;
  6.         this.age = age;
  7.     }
  8.     public boolean equals(Object o){
  9.         if (this==o)return true;
  10.         if (o==null||o.getClass()!=this.getClass())return false;
  11.         per o1 = (per) o;
  12.         return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age;
  13.     }
  14.     public int hashCode(){
  15.         return Objects.hash(name,age);
  16.     }
  17.         /*
  18.         这是Object类中的规范如果不同时重写将会导致很多类库出现业务不一致!
  19.         例如HashMap无法保证key值'唯一性'
  20.         下面测试代码p1和p2虽然地址不同 但是业务上看内容是相同的
  21.         所以应该只用一个key表示 但是不重写将无法正确插入!
  22.         */
  23. }
  24. class Example{
  25.     public static void main(String[] args) {
  26.         per p1 = new per("张三", 18);
  27.         per p2 = new per("张三", 18);
  28.         HashMap<per,Integer> map = new HashMap<>();
  29.         map.put(p1,1);
  30.         map.put(p2,2); //具体原理可以看put(k,v)源码!
  31.     }
  32. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4