为什么包含HashMap类的Value方法对于下面的程序返回False?

时间:2016-03-16 19:12:33

标签: java hashmap

这里我试图覆盖equals方法和哈希码方法。但containsValue()方法抛出False。即使是重写的哈希码被调用,但我认为equals方法没有被正确调用。请帮帮我。

import java.util.*; 

class Test{

    int i;

    Test(int i)
    {
        this.i=i;
    }

    public boolean equals(Test t)
    {
        if(this.i==t.i){
            return true;
        }
        else{
            return false;
        }
    }

    public int hashCode() { //Overriding hashCode class
        int result = 17; 
        result = 37*result + Integer.toString(i).hashCode(); 
        result = 37*result; 
        return result; 
    }
}

class TestCollection13{  
    public static void main(String args[]){  
        HashMap<Integer,Test> hm=new HashMap<Integer,Test>();  
        hm.put(1,new Test(1));  
        hm.put(2,new Test(2));  
        hm.put(3,new Test(1));  
        hm.put(4,new Test(4));  

        for(Map.Entry m:hm.entrySet()){
            Test t2=(Test)m.getValue();
            System.out.println(m.getKey()+" "+t2.hashCode());
        }

        System.out.println(hm.containsValue(new Test(2)));
    }
}

3 个答案:

答案 0 :(得分:1)

equals应定义为Object,而不是Test

@Override
public boolean equals(Object other)

您可以通过使用@Override显式注释方法来轻松检测到这种情况,在这种情况下,编译器会检测到此错误。

答案 1 :(得分:1)

您的方法public boolean equals(Test t)不会覆盖Object.equals(Object)。您需要更新方法签名并检查类类型:

@Override
public boolean equals(Object o) {
    return o instanceof Test
            && ((Test)o).i == this.i;
}

答案 2 :(得分:1)

方法equals()Object作为参数,因此在您的代码中,您不会覆盖equals()方法,而是重载它。因此,您需要将传入参数更改为Object。你的方法应该是这样的:

    @Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Test)) return false;
    Test test = (Test) o;
    return this.i == test.i;
}

另外,我会为你的i成员添加getter和setter。