【发布时间】:2024-01-11 04:49:01
【问题描述】:
我有这两个对象。
public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules1 = new HashMap<>;
public Map<String, Set<RuleConditionBl>> countryToNonSplittedRules2 = new HashMap<>;
我有一个比较这两个的测试
即使他们的内容是相同的,我也得到了错误的
countryToNonSplittedRules1.equals(countryToNonSplittedRules2);
这是一个例子:
我读过这个post,所以我不确定为什么不返回true
public class RuleConditionBl {
public int weight;
public boolean isAll;
public List<String> countries;
public UserFlag userFlag;
@JsonIgnore
private Range<LocalDate> datesRange;
public String fromDate;
public String toDate;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RuleConditionBl that = (RuleConditionBl) o;
if (weight != that.weight) return false;
if (isAll != that.isAll) return false;
if (countries != null ? !countries.equals(that.countries) : that.countries != null) return false;
if (userFlag != that.userFlag) return false;
return datesRange != null ? datesRange.equals(that.datesRange) : that.datesRange == null;
}
@Override
public int hashCode() {
// int result = weight;
int result = 0;
result = 31 * result + (isAll ? 1 : 0);
result = 31 * result + (countries != null ? countries.hashCode() : 0);
result = 31 * result + (userFlag != null ? userFlag.hashCode() : 0);
result = 31 * result + (datesRange != null ? datesRange.hashCode() : 0);
return result;
}
{
【问题讨论】:
-
在您的屏幕截图中没有观察到的一件事:您确定这些国家/地区是平等的吗?为了更容易调试:为什么不添加一个漂亮的 toString() 并打印出两个映射的内容?
-
你为什么要删除你的其他问题? 再次,
hashCode中应包含权重。 -
您不应将
UserFlag实例与userFlag != that.userFlag进行比较(即使在您的示例中两者都为空,因此不应影响结果)。使用等于 -
权重可能会包含在哈希码中以确保完整性,但省略并不是失败的原因。您可以将 hashCode 始终设置为 1 并且它应该仍然可以工作,只要 equals 定义正确。如果它不是枚举,我会更担心 userFlag - 但由于在这种情况下它为空,所以这不是问题。我建议启动一个调试器,添加断点并逐行执行 RuleConditionB1 的 equals 方法,看看它会从哪里退出。
-
如果您正在检查
UserFlag的相等性,您应该使用equals方法,如果UserFlag某些具有自己属性的对象也应该实现equals和hashcode方法。