• 为什么重写equals 时必须重写 HashCode 方法?


    什么是HashCode?

    hashCode是Java中Object类的一个方法,它返回一个整数值,作为对象的哈希码

    hashCode的主要作用是在散列数据结构中,如HashMap和HashSet,用于快速定位和查找对象。散列数据结构通过哈希码来确定对象存储的位置,这样可以大大提高数据的检索速度。

    以下是关于hashCode的一些详细解释:

    一致性:hashCode方法必须一致地返回相同的整数,前提是对象上equals比较中所用的信息没有被修改。这意味着,在应用程序执行期间,只要对象的内容不变,多次调用hashCode方法应当返回相同的值。


    与equals方法的关系:如果两个对象根据equals方法是相等的,那么这两个对象的hashCode方法也必须返回相同的值。这是因为equals方法用于比较两个对象是否逻辑上相等,而hashCode方法则提供了这种相等性的一个数值表示,用于散列数据结构中的对象定位。


    提高性能:hashCode的设计初衷是为了提高哈希容器的性能。如果没有hashCode,比较两个对象是否相等通常需要逐个字段进行比较,而有了hashCode后,可以通过比较哈希码快速排除不相等的对象,从而减少不必要的比较,提高性能。

    重写equals方法时也需要重写hashCode方法,以保证对象在散列数据结构中的正确行为和一致性。具体原因如下:

    一致性要求:当两个对象通过equals方法比较相等时,它们的hashCode方法必须返回相同的值。这是因为散列数据结构,如HashSet和HashMap,依赖于对象的哈希值来确定对象的位置。如果两个相等的对象返回不同的哈希值,它们可能会被错误地存储在集合的不同位置,导致错误的判断和数据不一致。因此,equals 方法被覆盖过,则hashCode 方法也必须覆盖


    正确性保证:如果不重写hashCode方法,对象将使用默认的hashCode实现,这可能导致即使equals方法表明两个对象相等,它们的哈希值也可能不同。这违背了哈希码的一般约定,即相等的对象必须具有相等的哈希码。
    性能考虑:在使用散列集合时,正确的hashCode实现可以提高性能。如果哈希码分布均匀,可以减少哈希冲突,从而提高查找、插入和删除操作的速度。

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


    避免潜在问题:在某些情况下,如果不重写hashCode方法,可能会导致诸如ConcurrentModificationException等运行时异常,或者在使用散列集合时出现意外的行为。


    综上所述,为了确保对象在Java集合框架中的正确性和一致性,同时提高程序的性能,重写equals方法时也应该重写hashCode方法。这是Java编程中的一个最佳实践。

  • 相关阅读:
    AQS实现原理
    Java,回形数
    Java面试——并发问题(sleep、synchronized、volatile等)
    PostMan 测试
    在portacle中获取EMACS Lisp帮助文档的方法(Win11)
    C#之泛型、委托、事件及其使用
    HashMap
    Java:2022年Java Web开发的未来会是什么样子?
    NLP学习(1)-搭建环境
    Windows与网络基础-28-子网划分
  • 原文地址:https://blog.csdn.net/m0_59166601/article/details/136423748