我在某个地方读到过,在HashMap的背景下: hashCode() allows sorting objects by their hash values, and then the Object#equals method only needs to be invoked when objects share the same hash value.

这是否意味着当最终调用equals()方法时,就已经比较了hashCode并发现它们一定相等?这种情况有什么例外吗?

问题的第二部分:在equals()方法中判断两个对象的hashCode()有意义吗?

public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null) {
            return false;
        }

        if (!(obj instanceof InternalObjectSerialized)) {
            return false;
        }
        InternalObjectSerialized<?> inputObj = (InternalObjectSerialized<?>) obj;

        if (!(Arrays.equals(this.bytes, inputObj.bytes))) {
            return false;
        }

        // Does the following line make any sense ??
        return this.hashCode() == inputObj.hashCode();
    }

推荐答案

从 comments 中总结如下:

在Java中,在Object#equals()调用期间,两个对象是否必须具有相同的hashCode?

两个彼此为.equals的对象做need以拥有相同的hashCode,但要由您来编写equals方法和hashCode方法来确保这是真的.

HashMap对两个关键对象调用equals()时,它是否首先确保哈希码相等?也许吧,但这并不能保证.这是一个我们不应该知道的实现细节.此外,HashMap的实现已经不止一次地在Java版本上发生了变化,并且可能再次发生变化,因此答案可能取决于Java版本.

  • 两个对象可以具有相同的hashCode,并且not可以相等,因为是hash collisions.
  • 等于must的两个对象生成相同的hashCode.

我们需要在equals()中比较hashCode吗?

不,您不需要在您的.equals实现中比较hashCodes,事实上您应该在not中这样做.

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

最小拓Flutter 排序的时间复杂度是多少?

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

Java记录的不同序列化/反序列化

通过合并Akka Streams中的多个慢源保持订购

使用Spring Boot3.2和虚拟线程的并行服务调用

OpenGL ES 3.0-纹理黑色

使用Jolt将字段转换为列表

如何在一行中使用Dijkstra中的Java Stream

如果按钮符合某些期望,如何修改它的文本?

Java SSLKeyManager出厂密码

Java中不兼容的泛型类型

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

如何在ApacheHttpClient 5中为单个请求设置代理?

本机方法(JNI)总是编译的吗?

没有Google Play服务,Firebase Auth无法工作

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?

在java中使用SevenZip.openArchive方法后无法删除文件

有没有办法仅将 JComboBox 中的选定项目居中(因此保持组合框中的所有项目左对齐)