【发布时间】: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