哈希表返回 null 但存在对象键

Hashtable returning null but object key is present

编辑:卧槽!我的哈希码实现有一个小写的 c。 -.-

我一直在尝试学习 TDD,并且一直在关注 'By Example' Kent Beck 的书;非常好!

但是,我似乎无法取得进展,因为当我访问哈希表时某个值返回 null。我有一个调试会话 运行,具有该值的对象显然存在,但结果为空。

构建和访问的代码是:

public void addRate(String from, String to, int rate){
    this.rates.put(new Pair(from, to), new Integer(rate));
}

从和到是 "GBP" 和 "USD"。也通过调试验证。

调用上面的测试用例:

@Test
public void testreduceMoneyDifferentCurrency(){
    Bank bank = new Bank();
    bank.addRate("GBP", "USD", 2);
    Money result = bank.reduce(Money.gbpound(2), "USD");
    assertEquals(Money.dollar(1), result);
}

bank中的reduce方法调用方法rate:

public Money reduce(Bank bank, String to){
    int rate = bank.rate(this.currency, to);
    return new Money(this.amount / rate, to);
}

问题出在哪里:

    public int rate(String from, String to){
    if (from.equals(to)) return 1;
    Integer rate = (Integer) this.rates.get(new Pair(from, to));
    return rate.intValue();
}

第一行处理 USD -> USD 转换等。

Pair 对象是 2 个字符串,用作键。

我没有大量使用 has 表,但我看不出问题出在哪里,我确定这些值在哈希表中,但 'rate' 总是返回空值。

只见树木不见森林。 :) 有人能给我指出正确的方向吗?

我认为问题出在 Pair 方法中。 当你这样做时:

this.rates.get(new Pair(from, to));

您正在创建 Pair 的新实例,它与您在 addRate 方法中放入地图的实例不同。

如果您希望代码正常工作,您要么必须使用相同的 Pair class 实例,要么在 equalshashCode 上正确实现方法=10=] class.

下面是对 HashMap 内部工作的更深入的了解,以及你必须做些什么才能让它工作:

Java 保留对象的引用。所以当你试图这样做时 this.rates.get(new Pair(from, to)); 您基本上是在创建 Pair 的新实例,它在您的 HashMap.

中不作为键存在