CodeQL 文档

不一致的 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

单击以在 CodeQL 存储库中查看查询

仅重写 equalshashCode 中的一个的类可能会违反 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 重写了 hashCodeequals

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;
	}
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私