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

4

2 回答 2

9

你还没有覆盖equals(Object),所以他们不比较相等。

仅仅因为两个对象具有相同的哈希码并不意味着HashMap假设它们是相同的——事实上,如果这样的话,那将是非常非常糟糕的。

如果您希望两个A对象被 视为相等HashMap,则必须覆盖equals(Object)inA以将一个对象定义A为与另一个对象相等。

于 2012-07-07T19:28:07.663 回答
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 方法都必须产生不同的整数结果。 但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

因此,当要知道两个对象是否相等时,正如 Louis 指出的那样,equals 是要走的路。哈希码仅告诉给定基于哈希的集合实现的对象在哪里/如何存储。

于 2012-07-07T19:32:48.950 回答