不一致的 equals 和 hashCode¶
ID: java/inconsistent-equals-and-hashcode
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- reliability
- correctness
- external/cwe/cwe-581
Query suites:
- java-security-and-quality.qls
仅重写 equals
和 hashCode
中的一个的类可能会违反 hashCode
方法的约定。该约定要求 hashCode
为任意两个相等对象提供相同的整数结果。不强制执行此属性可能会在散列数据结构中存储和检索此类对象时导致意外结果。
建议¶
通常,应重写这两个方法以确保它们一致。
示例¶
在以下示例中,类 InconsistentEqualsHashCode
重写了 hashCode
但没有重写 equals
。
public class InconsistentEqualsHashCode {
private int i = 0;
public InconsistentEqualsHashCode(int i) {
this.i = i;
}
public int hashCode() {
return i;
}
}
在以下示例中,类 InconsistentEqualsHashCodeFix
重写了 hashCode
和 equals
。
public class InconsistentEqualsHashCodeFix {
private int i = 0;
public InconsistentEqualsHashCodeFix(int i) {
this.i = i;
}
@Override
public int hashCode() {
return i;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
InconsistentEqualsHashCodeFix that = (InconsistentEqualsHashCodeFix) obj;
return this.i == that.i;
}
}
参考¶
J. Bloch,Effective Java(第二版),第 9 项。Addison-Wesley,2008 年。
Java API 规范:Object.equals,Object.hashCode。
IBM developerWorks:Java 理论与实践:散列。
帮助 - Eclipse 平台:Java 编译器错误/警告首选项。
通用弱点枚举:CWE-581。