即使我重写hashCode()方法,为什么containsValue方法返回true?

时间:2016-03-17 14:41:16

标签: java hashcode

即使在这里,如果我在下面的代码中注释掉覆盖的哈希码方法,输出对于containsValue方法也是如此,即使哈希码不同,请帮忙。我已经覆盖了equals方法,但是遇到了containsValue函数的问题。

import java.util.*; 
class Test{
    int i;
    Test(int i)
    {
        this.i=i;
    }
    public boolean equals(Object t)//overriding equals class
    {
        if(this.i==((Test)t).i){
            return true;
        }
        else{
            return false;
        }
    }
    /*public int hashCode() { //overriding the hashcode method
    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(1)));
    } 
}

1 个答案:

答案 0 :(得分:4)

哈希映射仅使用哈希码有效地查找。当您要求地图找到时,它基本上必须遍历其所有条目,此时使用equals毫无意义,因此它只是调用{ {1}}。

如果您反过来尝试使用地图,而Test作为键而不是值,则赢得工作而不会覆盖hashCode。< / p>