java - HashMap 返回 NULL

标签 java hashmap

我有一个类级别,其中声明了一个 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/

相关文章:

rust - `HashMap::get_mut` 导致 "returns reference to local value",有有效的解决方法吗?

java - 即使在覆盖同一对象的哈希码和等于之后,HashMap 也不会检索这两个值

java - Effective Java 的防御副本

java - 有什么方法可以创建一个通用列表,在其中添加类型和子类型?

java - Spring 3.1 : Redirect after login not working

Perl - Hash::Merge 丢失 key

java - 如何从 HashMap 或 LinkedHashMap 中获取有限数量的值?

hashmap - 如何将一系列数字散列到散列表中的单个位置

java - hashCode/equals 合约的 JUnit 理论

java - 无法将按钮图标与另一个图标进行比较