hashCode实现

时间:2012-07-07 19:27:30

标签: java hashcode

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 ???

2 个答案:

答案 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仅告知存储对象的位置/方式。