【问题标题】:Explaining statements in hashCode() method in plain English用简单的英语解释 hashCode() 方法中的语句
【发布时间】:2021-10-14 04:18:53
【问题描述】:

我正在尝试学习 Java 中 hashCode() 方法的基础知识。今天早上我读到了 Eugen Baeldung 的 article,但我仍然对他发布的代码中的某些问题感到困惑。我认为只需要方法本身的代码,但我发布整个代码以防万一。

package com.baeldung.hashcode.standard;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class User {

    private final Logger logger = LoggerFactory.getLogger(User.class);
    private long id;
    private String name;
    private String email;

    public User(long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null)
            return false;
        if (this.getClass() != o.getClass())
            return false;
        User user = (User) o;
        return id == user.id && (name.equals(user.name) && email.equals(user.email));
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 31 * hash + (int) id;
        hash = 31 * hash + (name == null ? 0 : name.hashCode());
        hash = 31 * hash + (email == null ? 0 : email.hashCode());
        return hash;
    }
    // getters and setters here   
}

在 hashCode() 方法中,第三行和第四行让我很困惑。看起来对于 name.hashCode() 和 email.hashCode(),我们在 name 和 email 上调用 hashCode() 方法,但是当它们被调用时,我们处于 hashCode() 方法本身的中间。这应该是递归的吗?我对递归函数没有很好的掌握,但这是我唯一知道的,你在被调用的函数中调用函数的位置。如果它不是递归的,有人可以向我解释它是什么吗?有人可以告诉我这是如何执行的吗?我真的很想明白这一点。

谢谢!

【问题讨论】:

  • “这应该是递归的”它不是递归的。它在其他对象上调用hashCode 方法。
  • 好的,这就是我感到困惑的地方。该方法命中前两行并有一个数字。但是在第三行,hash 包含了 name.hashCode() 的值,这意味着它必须回到第一行和第二行,然后它又碰到第三行,所以它必须回到第一行和第二行等等。如果 hash 尚未返回并且一直卡在第 3 行,name.hashCode() 如何返回修改 hash 的值?你能帮我看看吗?
  • 忽略User 中的hashCode 方法正在调用String 中称为hashCode 的方法这一事实。它只是调用“其他”方法。如果它正在调用其他方法,例如name.length() 或任何其他方法,它不会对流程产生任何影响。一个对象上的hashCode 方法不会阻止您在另一个对象上调用hashCode 方法(或any 方法)这一事实。
  • "但是在第三行hash包含了name.hashCode()的值,这意味着它必须回到第一行和第二行,然后又碰到第三行, “不,不,它没有。它不会回到那些线。它调用 不同的 hashCode 方法,它在不同的类中。这里没有循环。
  • 我想我现在明白了。你的两个cmets加上下面的答案终于为我解决了。谢谢!

标签: java recursion hashcode gethashcode


【解决方案1】:

String#hashCode

您的 emailname 变量每个都包含对 String 对象的引用。 String 类有自己的 hashCode 实现。

引用String#hashCode 的Javadoc:

返回此字符串的哈希码。 String 对象的哈希码计算为

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示求幂。 (空字符串的哈希值为零。)

因此,调用email.hashCode()name.hashCode() 是在不同的类上调用不同的hashCode 方法,而不是在你的类中调用hashCode 方法。

【讨论】:

  • 谢谢!您的回答加上上面的 cmets 终于为我解决了。
猜你喜欢
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2012-01-18
相关资源
最近更新 更多