Java HashMap.containsKey()不调用equals()

Wil*_*kar 24 java equals hashmap containskey

我有一个hashmap:

Map<LotWaferBean, File> hm = new HashMap<LotWaferBean, File>();

LotWaferBean lw = new LotWaferBean();
... //populate lw
if (!hm.containsKey((LotWaferBean) lw)) {
  hm.put(lw, triggerFiles[l]);
}
Run Code Online (Sandbox Code Playgroud)

代码LotWaferBean:

@Override
public boolean equals(Object o) {
        if (!(o instanceof LotWaferBean)) {
              return false;
        }
        if (((LotWaferBean) o).getLotId().equals(lotId)
                    && ((LotWaferBean) o).getWaferNo() == waferNo) {
              return true;
        }
        return false;
  }
Run Code Online (Sandbox Code Playgroud)

在我的IDE中,我将断点放入,equals()但它永远不会被执行.为什么?

Laz*_*key 41

尝试在hashCode()中放置一个断点.

如果映射中两个对象的hashCode()返回相同的数字,则将调用equals以确定它们是否真的相等.

  • 更具体地说,如果你实现`equals`方法,你应该实现`hashcode` one ...如手册中所写:) (16认同)
  • 我发现一种简单的方法是在Eclipse中使用向导,只需运行Source | 生成hashCode()和equals(). (8认同)

Abi*_*san 5

JVM 会检查该对象的hashcode 的hashcode 桶,如果有更多具有相同hashcode 的对象,则只会执行equals() 方法。而且,开发人员应该遵循 hashCode() 和 equals() 方法之间的正确约定。


卢声远*_* Lu 5

只有当2个hashCodes相等时,equals()才会在循环键中调用它.