assertEquals(tree.contains(obj),hash.contains(obj))在覆盖hashCode()

时间:2019-04-03 23:36:40

标签: java override hashcode

我上学的一个实验室让我同时覆盖了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)

0 个答案:

没有答案