有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HashMap正在返回NULL

我有一个类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的值与这个对象匹配时,它就匹配了。 但在计算单价时。即使设置了Object1,获取(unit)其返回的null。Object1正在使用以下行从其他类返回:-

return new Object1();

有谁能帮我解开这个谜吗

BasicUnit是一个实现单元接口的类。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;

}

和哈希代码:-

 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) 个答案

  1. # 1 楼答案

    if (flags != basicUnit.flags) return false;
    

    您正在检查Unit对象是否具有完全相同的ArrayList标志。这不是equals()类型的相等性检查;这是在检查几乎相同的ArrayList标志。现在,您还没有提供构造函数等,但我非常怀疑您是否在重用相同的ArrayList

    改为检查!(flags.equals(basicUnit.flags))。一定要注意ArrayList.equals()使用了E.equals()实现,所以一定要确保实现了

    另外,请注意ArrayList.equals()以相同的顺序检查相同的列表条目。我不知道你们旗帜的顺序是否重要,但我怀疑可能不重要。如果情况属实,您可以考虑将标记集合设为^ {CD10}}。p>