我上学的一个实验室让我同时覆盖了equals和hashCode方法。我已经能够很好地执行equals方法,但是我遇到了hashCode方法的一些问题。
我的equals代码看起来像这样,我认为我做对了,但我不确定100%
@Override public boolean equals(Object other){
if(this == other){
return true;
}
if(other == null){
return false;
}
if(!(other instanceof Polynomial)){
return false;
}
Polynomial other2 = (Polynomial) other;
if(this.getDegree() != other2.getDegree()){
return false;
}
for(int i=0;i<this.getDegree();i++){
if(this.getCoefficient(i)!=other2.getCoefficient(i)){
return false;
}
}
return true;
}
以下是我的hashCode方法,我通过使用eclipse为hashCode提供的自动生成功能来到了这里
@Override public int hashCode() {
final int p = 31; //prime
int res = 1;
res = p * res + ((coefficients == null) ? 0 : coefficients.hashCode());
res = p * res + this.getDegree();
return res;
}
我认为应该没问题,但是提供给我们用来检查实验室的自动测试仪遇到了问题。以下代码段会引起问题。 BlueJ将assertEquals标记为错误,表示预期为true,但结果为false。具体来说就是BlueJ捕获的assertEquals(tree.contains(p1),hash.contains(p1))。
@Test public void massTest() {
Random rng = new Random(SEED);
TreeSet<Polynomial> tree = new TreeSet<Polynomial>();
HashSet<Polynomial> hash = new HashSet<Polynomial>();
CRC32 check = new CRC32();
for(int i = 0; i < TRIALS; i++) {
Polynomial p1 = createRandom(rng.nextInt(10), rng);
Polynomial p2 = createRandom(rng.nextInt(10), rng);
assertEquals(tree.contains(p1), hash.contains(p1));
tree.add(p1);
hash.add(p1);
assertEquals(0, p1.compareTo(p1));
assertEquals(0, p2.compareTo(p2));
assertEquals(p1.compareTo(p2), -p2.compareTo(p1));
check.update(p1.compareTo(p2));
}
assertEquals(tree.size(), hash.size());
for(Polynomial p: tree) {
assertTrue(hash.contains(p));
}
for(Polynomial p: hash) {
assertTrue(tree.contains(p));
}
assertEquals(28339163L, check.getValue());
}
}
我现在的问题是我无法弄清楚到底是我做错了什么,老实说,我也不确定assertEquals到底在检查什么。如果有人能指出正确的方向,我将不胜感激。
给我的确切错误是
java.lang.AssertionError:预期:正确,但之前是:false
在org.junit.Assert.fail(Assert.java:88)
在org.junit.Assert.failNotEquals(Assert.java:743)
在org.junit.Assert.assertEquals(Assert.java:118)
在org.junit.Assert.assertEquals(Assert.java:144)
在PolynomialTestThree.massTest(PolynomialTestThree.java:59)