Hashcode,等于java中的契约

时间:2014-09-05 09:35:54

标签: java equals hashcode

public class VO {

    public int hashcode()
    {
        return 0;
    }
    public boolean equals(Object obj)
    {
        return true;
    }

    public static void main(String args[])
    {
        VO vo1 = new VO();
        VO vo2 = new VO();

        Map<VO,Integer> map = new HashMap<VO, Integer>();

        map.put(vo1, 1);
        map.put(vo2, 1);

        System.out.println(map.size());
    }
}

我得到的输出是:2

但据我所知,输出为1。

当我在地图中放置一个元素时,它将检查密钥的哈希码,如果该哈希码相同,那么它将检查equals。如果两个方法都返回相同,它将覆盖先前的值。

在我的情况下,两个方法都是(hashcode和equals)返回0和true.So最后在map中必须有一个元素。但是这里我的大小为2。

可能是什么原因。谢谢你......

2 个答案:

答案 0 :(得分:11)

您没有覆盖Object.hashCode,您正在实施自己的hashcode()方法(请注意大写的C)。

一个好的做法是在覆盖时始终使用@Override注释。请参阅:When do you use Java's @Override annotation and why?

答案 1 :(得分:2)

hashcode()小“c”)只是作为普通方法,而是调用对象类方法hashCode()

public class VO {

    @Override
    public int hashCode() {
        return 0;
    }

    @Override
    public boolean equals(Object obj) {
        return true;
    }
}