【发布时间】:2019-04-16 11:16:32
【问题描述】:
我正在尝试计算一个类的哈希码,但我得到了 stackoverflow。我怎样才能正确地做到这一点?我通过 IntelliJ 的想法生成了它,但仍然如此。有stackoverflow,我知道原因(可能)但我真的想计算正确的哈希码..
public class Main {
public static void main(String[] args) {
TestA testA = new TestA();
TestB testB = new TestB();
testA.id = 1;
testA.name = "test";
testA.testB = testB;
testB.testA = testA;
testB.id = 1;
testB.name = "test";
System.out.println(testA.hashCode());
}
}
class TestB {
int id;
String name;
TestA testA;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof TestB)) return false;
TestB testB = (TestB) o;
if (id != testB.id) return false;
if (name != null ? !name.equals(testB.name) : testB.name != null) return false;
return testA != null ? testA.equals(testB.testA) : testB.testA == null;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (testA != null ? testA.hashCode() : 0);
return result;
}
}
class TestA {
int id;
String name;
TestB testB;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof TestA)) return false;
TestA testA = (TestA) o;
if (id != testA.id) return false;
if (name != null ? !name.equals(testA.name) : testA.name != null) return false;
return testB != null ? testB.equals(testA.testB) : testA.testB == null;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (testB != null ? testB.hashCode() : 0);
return result;
}
}
我也包含了 main 函数。你可以轻松打开这个..
【问题讨论】:
-
不知道你有没有注意到,但是你已经有一个hashcode实现了,那么有什么问题
-
尝试运行这个 - 我得到了 stackoverflow
-
这与您的哈希码无关。您在 testA 和 testB 之间存在循环依赖关系
-
@Stultuske 我不确定这应该如何回答这个问题或帮助他,除非你试图暗示循环引用总是错误的(事实并非如此)。跨度>
-
不,他们确实不是。但是调用哈希码与调用循环引用导致stackoverflow错误的机会..