class A{
@Override
public int hashCode() {
return 10;
}
}
public class SampleClass {
public static void main(String[] args){
Map map = new HashMap();
map.put(new A(), "A");
map.put(new A(), "B");
System.out.println(map.size());
System.out.println(new A().hashCode());
System.out.println(new A().hashCode());
}
}
输出: -
2
10
10
为什么2 ???如果我们正在实现返回相同整数的hashCode方法。不应该是1 ???
答案 0 :(得分:9)
您尚未覆盖equals(Object)
,因此它们不会相等。
仅仅因为两个对象具有相同的哈希码并不意味着HashMap
假设它们是相同的 - 事实上,如果那个是的话,那就是真的,非常糟糕。
如果您希望A
将两个HashMap
个对象视为相等,则必须覆盖equals(Object)
中的A
,以将A
定义为等于另一个。
答案 1 :(得分:3)
来自http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode()
hashCode的一般合约是:
每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终如一 返回相同的整数,前提是equals中没有使用的信息 对象的比较被修改。不需要保留该整数 从一个应用程序的执行到另一个执行的一致性 相同的申请。
如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法 产生相同的整数结果。
根据equals(java.lang.Object)方法,如果两个对象不相等则不需要调用hashCode方法 在两个对象中的每一个上必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表。
因此,当谈到知道两个物体是否相等时,等于是路易斯所指出的方式。在给定基于散列的集合实现的情况下,Hashcode仅告知存储对象的位置/方式。