为什么要重写"equlas"和"hashCode"方法???

Java语言基础 同时被 2 个专栏收录
2 篇文章 0 订阅
7 篇文章 0 订阅

为什么要重写"equlas"和"hashCode"方法???

我们在写类的时候,如果重写了"equals"'一般也会重写"hashCode"方法,因为这就与我们现实生活中的业务系统逻辑息息相关.

一、equals方法:

1,“equals"方法在未重写时,就相当于”==",比较的是两者的地址值,但是我们在使用的时候会发现并不是如此,原因是什么呢?

那就是有一些类库已经重写过了Object的"equals"方法,比如说String类,Date类等,它们在使用的时候比较的是属性内容而不是地址值.下面带大家来了解一下String类的.

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

但我们自己定义的类库需要自己去重写,你创建对象的时候都是"new"出来的,地址值肯定不会相等,这时需要重写"equals"方法,然后根据逻辑需求规定对象是否相等,当然现在大部分编程工具都已经写好了,快捷键就能自己写代码,不用自己去手写.

2,下面是JDK翻译版: //足以看出底层源码比较的是地址值.

public boolean equals(Object obj): 指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 - - equals 比较中所用的信息没有被修改。
    对于任何非空引用值 x,x.equals(null) 都应返回 false。
    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该方法规定相等对象必须具有相等的哈希码。
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。

二、"hashCode"方法:

  1. 我们看到"hashCode"方法就会联想到容器,比如: HashSet、HashMap以及HashTable、ConcurrentHashMap。
  2. hash表结构: JDK1.8以前是使用的数组加链表结构,而JDK1.8及以后是使用数组加链表(红黑树)结构,当链表长度达到8以后就使用红黑树进行存储。确定hash值就确定了数组上的位置,hash值相同就会在该数组的位置的下方进行链式结构存储或红黑树结构存储。
  3. 当集合要添加新的对象时,先调用这个对象的hashCode()方法,得到对应的hash值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashCode值,如果table中没有该hashCode值,它就可以直接存进去,不再进行任何比较了;如果存在该hashCode值, 则会调用它的equals方法与该hash值位置上的所有元素一一进行比较,有相同的话就不存了,跟他们不相同就存入.
  4. Java中的hashCode()方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为hash值(hash又叫"散列")。
  5. HashCode()方法的存在主要是为了查找的快捷性,HashCode()方法是用来在散列存储结构中确定对象的存储地址的
  6. hashCode()方法的效率比equals()方法高,如果集合中已经存在一万条数据或者更多的数据,采用equals方法去逐一比较,效率非常低。此时hashCode方法的作用就体现出来了,这样一来实际调用equals方法的次数就大大减少了.

三、总结

  1. 如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写

  2. 如果两个对象equals()方法比较后相等,那么这两个对象的Hash值一定也相同

  3. 如果两个对象的Hash值相等,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

  4. equals()方法和hashCode()方法是自定义的类中和Set集合Map集合中重写的多.

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值