关于HashCode的官方文档定义

支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。如果多次执行同一个应用时,不要求该整数必须相同。 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数实现的,但是 JavaTM 编程语言不需要这种实现技巧) 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


抽出以下几个关键点:

  1. 未重写 equals(Object) 时,不同对象的 hashCode 是不同的 。
    • [ 未重写 equals 时,默认调用objectequals方法,比较两个 对象的引用是否相同 ]
    • [ 未重写 hashCode时,默认调用object**hashCode**方法,返回对象在堆内的地址 ]
  2. equals(Object) 相等 ,则 hashCode 必须相等 。
  3. equals(Object) 重写,则 hashCode 必须重写 。 [ 保证 规则2 成立 ]
  4. 两个对象的 hashCode 相同,并不一定表示两个对象就相同,即不能保证 equals(Object) 相同。

解释为什么先比较HashCode,相等后再比较equals原因

  1. 规则4:两个对象的hashCode相同,不能判定两个对象是相同的,如Set的唯一性,因此需要equals判断
  2. 先比较hashCode是因为效率问题,hashCode计算快 O(1) 内计算出,而equals 需要挨个遍历 O(n)

解释equals重写后,HashCode必须重写的原因

  1. 为了使此类情况成立,当equals成立后,hashCode也能得到相同的结果 。确保插入 Set 的唯一性
  2. hashcode 存在意义是快速定位到桶处,若桶都找不到,能够判断桶内元素是否相等,无意义 。

==和equals()的区别

本身特质:

==:操作符 equals:方法

适用对象:

==:主要用于八种基本类型之间的比较,也可用于比较对象 equals():对象之间的比较(基本类型的包装器类型,string,自定义的对象等)

比较时区别:

==:比较两个对象是否指向同一个对象,也就是他们指向对象的首地址是否相同 equals():

  1. 1. 重写前 :与**==**符号没有区别
  2. 1. 重写后 :从而比较对象的内容是否相同