每天记录学习的新知识 : hashcode 和 equals

参考地址

参考地址:浅谈Java中的hashcode方法

hashCode 与 equals

hashCode

hashCoedObject类里面的方法,返回值是一个对象的哈希码

方法:

    @Override
    public int hashCode() {
        return super.hashCode();
    }
       
    public int hashCode() {
        throw new RuntimeException("Stub!");
    }

没有具体实现是因为这是本地方法。
本地方法 --> 就是用关键字native修饰的方法,通过这些方法可以调用java以外的程序,例如c语言写的程序

Native具体方法:Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?,object hashcode
具体实现讲解跳转到–>Java中hashCode的实现

那么最终哈希值返回的是什么?

有些朋友误以为默认情况下,hashCode返回的就是对象的存储地址,事实上这种看法是不全面的,确实有些JVM在实现时是直接返回对象的存储地址,但是大多时候并不是这样,只能说可能存储地址有一定关联。

那么哈希值都可以是哪些值呢?

  1. 随机数
  2. 基于内存地址生成
  3. 固定值:1,用来测试
  4. 自增
  5. 利用位移生成随机数

equals

equals的作用是比较对象(地址)

hashCode 与 equals的比较

结论:

equals比较相等,hashCode 肯定相等;hashCode 比较相等,equals不一定相等。

为啥?

  1. 如果equals比较的结果是两个对象地址相同,那么他们的值肯定是相等的。他们的值相等时,同一个JVM上,哈希值肯定相等。

  2. 哈希值相等的两个对象地址一定相等吗?不见得。因为哈希值是通过特定算法计算出来滴。可能两个对象的值算出相同的哈希值,也可能算出不同的哈希值。

扩展下

我们知道了哈希值是什么东西了,或者怎么实现滴,那么:

哈希值有什么用呢?

举个栗子:

有十个人,你想知道小明在不在里面,可以用For循环来实现。(List实现)

也可以用哈希值,将十个人的人名在存入的时候,存入哈希值,以哈希值为KEY,即可快速知道,小明存不存在其中。(HashMap实现)

Obj中的hashCode()有啥用?

支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

你可能感兴趣的:(面试zsd,数据结构)