相同的hashCode,但在HashMap中有两个不同的条目

时间:2015-01-25 05:13:17

标签: java hashmap hashcode

我所知道的是:在HashMap中插入元素时,Java检查hashCode的值并将该元素插入HashMap内部,并在从HashMap检索对象时,Java检查HashCode的值并检索具有该值的对象从该HashCode生成。这是对的吗?

我创建了一个模式来覆盖HashCode的默认实现。每次调用该模态时,它都会返回相同的值。那么,如果我们一次又一次地添加该模态,为什么HashMap中的条目正在增加?

这是我的代码:

模态:

 public class MyModal {
  int empId;
 String empName;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyModal myModal = (MyModal) o;

    if (empId != myModal.empId) return false;
    if (empName != null ? !empName.equals(myModal.empName) : myModal.empName != null) return false;

    return true;
}

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

public MyModal(int empId, String empName) {
    this.empId = empId;
    this.empName = empName;
}
}

public class TestHashCode {
public static void main(String[] args) {
    HashMap<MyModal, Integer> hashMap = new HashMap<>();

    MyModal modal1 = new MyModal(1, "a");
    MyModal modal2 = new MyModal(2, "b");

    hashMap.put(modal1, 1);
    hashMap.put(modal2, 2);

    System.out.println("Size is" + hashMap.size());
    System.out.println(modal1.hashCode() + " "+modal2.hashCode());
}
}

输出:

Size is2
1 1

2 个答案:

答案 0 :(得分:0)

散列碰撞不是映射构造中唯一的限制因素,但返回常量1是“最差”的情况Map,它的行为类似于LinkedList(每个元素都在一个存储桶中)。来自Object.hashCode() Javadoc

  

不需要如果两个对象根据equals(java.lang.Object)方法不相等,则在两个对象中的每一个上调用hashCode方法必须产生不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

答案 1 :(得分:-1)

HashCode和Equals都需要实现。散列代码用于缩小搜索范围,等于需要实现以定义相等性。两个不相等的对象可以具有相同的哈希码,但并不意味着它们是相等的。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()