首页 > 解决方案 > 当 hashCode 被覆盖时,Ignite 如何执行 cache.get() 操作?

问题描述

请参阅下面的图片。

图片.png

我已使用 equals 方法将键放入缓存,如下所示:

@Override
public boolean equals(Object obj) {
    HierarchyMasterKey hierarchyMasterKey = (HierarchyMasterKey) obj;   

    return  equalTo(this.hmCustNo, hierarchyMasterKey.hmCustNo) &&
            equalTo(this.hmFromDate, hierarchyMasterKey.hmFromDate) &&
            equalTo(this.hmParentCustNo, hierarchyMasterKey.hmParentCustNo) &&
            equalTo(this.hmActNo, hierarchyMasterKey.hmActNo);

 } 

(equalTo 方法基本上是 null 安全的等于检查。)

和 hashCode 计算如下:

    @Override 
    public int hashCode() { 
            return Objects.hash(hmCustNo,hmActNo); 
    } 

当我尝试从中获取时,equals 方法将不会被执行。为什么会这样?ignite如何在不执行equals的情况下获取key?

[我有一个缓存,它有一个 HierarchyMasterKey 和一个 HierarchyMaster 列表作为值,并使用 Externalizable 覆盖哈希码和等于]

标签: javajakarta-eeignite

解决方案


在这里发现了问题。这实际上是一个有趣的观察。

我的缓存在堆上被禁用。Ignite 将对堆外项目进行 BPlusTree 搜索,它不需要执行 equals 方法来查找结果。

如果启用,它将像 hashmap get 操作一样工作。


推荐阅读