我尝试自定义方法包含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语句中执行一些代码。此外,断点不会停在等于方法..
答案 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
类型进行比较。