HashMap返回NULL

时间:2015-11-05 12:26:37

标签: java hashmap

我有一个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;

}

1 个答案:

答案 0 :(得分:2)

prodref

您正在检查if (flags != basicUnit.flags) return false; 个对象是否具有完全相同的Unit个标记。这不是ArrayList - 类型的相等检查;这是检查字面上相同的equals()标志。现在,您还没有提供构造函数等,但我非常怀疑您是否正在重复使用ArrayList

请检查ArrayList。请注意!(flags.equals(basicUnit.flags))使用ArrayList.equals()实现,因此请确保已实现。

另请注意,E.equals()以相同的顺序检查相同的列表条目 。我不知道你的旗帜的顺序是否重要,但我怀疑它可能没有。如果是这种情况,您可以考虑将您的旗帜集合设为ArrayList.equals()