我有一个Class Levels,它声明了一个hashMap。
public class Levels{
private final Map<Unit, Object1> rateUnitCost;
public Levels(Map<Unit, Object1> levels) {
this.rateUnitCost = new HashMap<Unit, Object1>(levels);
}
public Object1 getCoverageLevel(Unit unit, Phase aP) {
return rateUnitCost.get(unit);
}
}
我从其他类调用getCoverageLevel()方法,我也在实例化Levels类rateUnitCost属性以及另一个类。
在调试器中查看时,我发现了rateUnitCost和unit对象的这个值。 rateUnitCost: - 哈希地图值
rateUnitCost HashMap<K,V> (id=1248)
[0] HashMap$Node<K,V> (id=1266)
key >Unit (id=1249)
amount Money (id=1267)
flags ArrayList<E> (id=1268)
procedureId 7156
ParticipationId 104152413
value >Object1 (id=1250)
现在单位对象的价值如下: -
unit Unit (id=1251)
amount Money (id=1258)
flags ArrayList<E> (id=1259)
procedureId 7156
ParticipationId 104152413
当我将key的值与此对象匹配,然后匹配。 但是在rateUnitCost.get(unit)时,即使设置了Object1,它也会返回null。使用下面的行从其他类返回Object1: -
return new Object1();
任何人都可以帮我解决这个谜。?
BasicUnit是一个实现Unit接口的类。 BasicUnit有等于下面的方法: -
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicUnit basicUnit = (BasicUnit) o;
if (flags != basicUnit.flags) return false;
if (procedureId != basicUnit.procedureId) return false;
if (ParticipationId != basicUnit.ParticipationId) return false;
if (amount != null ? !amount.equals(basicUnit.amount) : basicUnit.amount != null) return false;
return true;
}
和HashCode: -
public int hashCode() {
int result = procedureId;
result = 31 * result + ParticipationId;
result = 31 * result + (amount != null ? amount.hashCode() : 0);
result = 31 * result + (flags == null ? null : flags.hashCode());
return result;
}
答案 0 :(得分:2)
prodref
您正在检查if (flags != basicUnit.flags) return false;
个对象是否具有完全相同的Unit
个标记。这不是ArrayList
- 类型的相等检查;这是检查字面上相同的equals()
标志。现在,您还没有提供构造函数等,但我非常怀疑您是否正在重复使用ArrayList
。
请检查ArrayList
。请注意!(flags.equals(basicUnit.flags))
使用ArrayList.equals()
实现,因此请确保已实现。
另请注意,E.equals()
以相同的顺序检查相同的列表条目 。我不知道你的旗帜的顺序是否重要,但我怀疑它可能没有。如果是这种情况,您可以考虑将您的旗帜集合设为ArrayList.equals()
。