常见面试题-hashCode到底是什么?

HashCode 到底是什么?

hashCode()的作用是获取哈希码,也成为散列码,它实际上是返回一个 int 整数,这个哈希码的作用是确定该对象在哈希表中的索引位置(即数据在堆中存放的地址)

hashCode() 定义在 JDK 的 Object.java 中,Java 中的任何类都包含有 hashCode() 函数。散列表存储的是键值对(key-value),它的特点是:能根据快速检索出对应的

如何使用 hashCode 获取到对象在堆中的存放地址?

public static void main(String[] args) throws Exception {
    Object str = new Object();
    // 将对象的 hashCode 转为 16 进制
    String addr = Object.class.getName() + "@" + Integer.toHexString(System.identityHashCode(str));
    System.out.println(addr);
    System.out.println(str);
}
/**
 * 输出
 * java.lang.Object@2a84aee7
 * java.lang.Object@2a84aee7
 */

为什么要有 hashCode

HashCode的存在主要是为了查找的快捷性

HashSet如何检查重复为例子来说明如何去使用 hashCode?

对象加入 HashSet 时,HashSet 会先计算对象的 hashCode 值来判断对象加入的位置,看该位置是否有值,如果没有,HashSet 会假设对象没有重复出现。但是如果发现有值,这是会调用equals()方法来检查两个对象是否真的相同,如果两者相同,HashSet 就不会让其加入集合,如果不同,就会再次散列到其他位置,这样就大大减少了调用 equals 的次数,大大提高了执行速度,因此在 Set 中添加对象,需要遵循下边两个准则:

  • 如果两个对象相同,就适用于equals(java.lang.Object)方法,那么这两个对象的 hashCode 一定要相同
  • 如果对象的 equals 方法被重写,那么对象的 hashCode 方法也要重写,并且产生 hashCode 使用的对象一定要和 equals 方法中使用的一致,否则会违反上一条原则

equals() 和 hashCode() 的联系?重写了 equals() 必须要重写 hashCode() 吗?

首先,equals() 是比较两个对象是否相等(在 Object 类中,equals() 里比较两个对象相等是根据对象的地址进行比较的,String 中就重写了 equals 方法),而 hashCode() 返回的是对象的内存地址,所以 hashCode 主要是用于查找使用的,而 equals() 是用于比较两个对象是否相等的

因此 equals() 和 hashCode() 联系为:

  • 如果两个对象 equals() 为 true,那么这两个对象的 hashCode() 一定相同
  • 如果两个对象的 hashCode() 相同,并不代表两个对象的 equals() 为 true,hashCode 相同只能代表这两个对象在散列表中是在数组的同一个位置中(即这两个对象发生了哈希冲突)

关于 hashCode 和 equals 的准则:

  • 如果重写 equals,就必须重写 hashCode
  • 因为 Set 存储不重复的对象,是依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法
  • 如果自定义对象作为 Map 的键,则必须重写 hashCode 和 equals

你可能感兴趣的:(面试题,java,开发语言)