实施等于和ArrayList.contains()的哈希码无法正常工作

时间:2012-03-23 11:16:15

标签: java

我尝试自定义方法包含ArrayList,我用Eclipse在类TaskCandidateListItemDo中生成这些方法

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result;

    if (keyValue == null) {
        result += 0;
    } else {
        result += keyValue.hashCode();
    }

    return result;
}

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

    TaskOverrideItemDo other = (TaskOverrideItemDo) obj;

    if (keyValue == null) {
        if (other.keyValue != null) {
            return false;
        }
    } else if (!keyValue.equals(other.keyValue)) {
        return false;
    }
    return true;
}

以下是我如何使用它

taskCandidateList = (List<TaskCandidateListItemDo>) namedQuery.list();

for (TaskOverrideItemDo taskOverrideItemDo : validateOverrideListSearchCriteriaDo
        .getTaskOverrideItemDoList()) {

    if (taskCandidateList.contains(taskOverrideItemDo.getKeyValue())) {
       // do some code
    }
}

我的列表声明如下:

private List<TaskCandidateListItemDo> taskCandidateList;

即使keyValue存在,//也会在if语句中执行一些代码。此外,断点不会停在等于方法..

2 个答案:

答案 0 :(得分:2)

我怀疑这是问题所在:

if (getClass() != obj.getClass()) {
    return false;
}

假设这是来自Hibernate,你得到的实际对象可能是TaskCandidateListItemDo的一些字节码操作的子类。

当然,你应该能够通过调试器告诉它。只需在return false ...

上设置一个断点(或记录)

答案 1 :(得分:1)

尝试:

if (taskCandidateList.contains(taskOverrideItemDo)) {

如果没有getKeyValue(),我认为它会返回字段keyValue的值(并且您的equals方法仅比较TaskCandidateListItemDo,因为:

if (getClass() != obj.getClass()) {
    return false;
}

作为替代方案,您可以支持与keyValue方法中的equals类型进行比较。