我有一个类级别,其中声明了一个 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和单位对象的这个值。 rateUnitCost: - HashMap 值
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
当我将键的值与该对象匹配时,它就会匹配。 但在rateUnitCost.get(unit)时,即使设置了Object1,它也会返回null。使用以下行从其他类返回 Object1:-
return new Object1();
谁能帮我解开这个谜团?
BasicUnit 是一个实现 Unit 接口(interface)的类。 BasicUnit 有 equals 方法如下:-
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;
}
和哈希码:-
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;
}
最佳答案
if (flags != basicUnit.flags) return false;
您正在检查您的 Unit
对象是否具有完全相同相同的 ArrayList
标志。这不是 equals()
类型的相等检查;这是检查字面上相同的 ArrayList
标志。现在,您还没有提供构造函数等,但我非常怀疑您正在重用相同的ArrayList
。
检查!(flags.equals(basicUnit.flags))
。请注意,ArrayList.equals()
使用 E.equals()
实现,因此请确保已实现该实现。
另外,请注意 ArrayList.equals()
按相同的顺序检查相同的列表条目。我不知道你的标志的顺序是否重要,但我怀疑它可能不重要。如果是这种情况,您可以考虑将您的标志集合设置为Set
。
关于java - HashMap 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33544527/