Hashtable返回null但存在对象键

时间:2015-04-28 14:19:05

标签: java hashtable

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

我一直在努力学习TDD并且一直在关注'通过示例' Kent Beck的书;它非常好!

但是,我似乎无法进步,因为当我访问哈希表时,值返回null。我已经运行了一个调试会话,并且具有该值的对象显然已经存在,结果为null。

构建和访问的代码是:

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

来自和#34; GBP"和" USD"。也通过debug验证。

调用上面的测试用例:

@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);
}

银行中的reduce方法调用方法速率:

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();
}

第一行应对美元 - >美元转换等。

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

我没有使用过很多桌子,但是我无法看清问题是什么,我肯定知道这些值是在散列表中但是' rate'总是返回一个空值。

我看不到树木了。 :)有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

如果您希望代码正常运行,您必须使用Pair类的相同实例,或者在equals类上正确实现hashCodePair方法。

以下是对HashMap内部工作的深入了解,以及为使其发挥作用必须采取的措施:https://stackoverflow.com/a/6493946/2266098

答案 1 :(得分:0)

Java保留对象的引用。所以当你想要这样做的时候 this.rates.get(new Pair(from, to)); 您基本上是在创建Pair的新实例,该实例在HashMap中不作为密钥存在。