hashCode介绍

   在java.lang.Object 源码中的hashCode方法:

  public native int hashCode();

  所以,所有类都可以使用hashcode()方法。

  然而,native--本地的,这个关键字有点陌生,似乎没怎么见过。

  于是,找到大佬的博客:Java中Native关键字的作用


 

  回到hashcode:

  hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。

  散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

  hashCode()与equals()的相关规定:

  如果两个对象相等,则hashcode一定也是相同的

  两个对象相等,对两个对象分别调用equals方法都返回true

  两个对象有相同的hashcode值,它们也不一定是相等的

  因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

  hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

  面试题:

hashCode和equals方法的区别:

1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

 2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

     因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?

     因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠。

解决方式:

     当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性。

  我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

  当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

  重写hashcode()方法

  哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。

object中:public native int hashCode();

String中:“s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]”--------注释中这样写的,s[i]对应char数组的ASCII码值,a--97。代码如下:

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

Integer:

public static int hashCode(int value) {
    return value;
}
posted @ 2021-02-18 19:22  少时也曾爱白衣  阅读(284)  评论(0编辑  收藏  举报